【问题标题】:Best way to divide a larger dataframe into two organized dataframes?将较大的数据帧分成两个有组织的数据帧的最佳方法?
【发布时间】:2021-01-24 02:40:55
【问题描述】:

我有以下数据框:

data <- structure(list(ID = c(101L, 102L, 201L, 202L, 
301L, 302L), bin1 = c(263L, 276L, 270L, 163L, 
268L, 233L), bin2 = c(53L, 42L, 42L, 146L, 57L, 33L
), bin3 = c(11L, 12L, 7L, 7L, 0L, 59L), bin4 = c(1L, 
0L, 10L, 3L, 0L, 4L), class = "data.frame"))

data <- as.data.frame(data)
data <- data[-c(6)]

我正在尝试使用这种方法将数据框组织成两个单独的数据框:

One <- grep('01$', data$ID)
Two <- grep('02$', data$ID)

DataOne <- subset(data, Reduce(`|`, lapply(data[One], `>=`, 0)))

这会产生未定义的列选择错误。好的。所以,我试试这个方法:

DataOne <- subset(data, select=data[One])

我收到错误“invalid subscript type 'list'”所以它不适用于列出的数据。

我基本上是在尝试从一个数据框创建两个数据框,同时保留原始数据框。我希望grep() 函数能够工作。

我希望得到这个:

ID  bin1 bin2 bin3
101 263  53   11
201 270  42   7
301 268  57   0

以 DataOne 为例。

【问题讨论】:

  • @akrun 我加了。

标签: r


【解决方案1】:

我们可以使用split 创建两个数据集的list。如果需要创建多个对象,可以使用list2env(虽然不推荐)

lst1 <- setNames(split(data, grepl('01$', data$ID)),
       paste0("Data", c("One", "Two")))
list2env(lst1, .GlobalEnv)

-输出

DataOne
#   ID bin1 bin2 bin3 bin4
#2 102  276   42   12    0
#4 202  163  146    7    3
#6 302  233   33   59    4

DataTwo
#   ID bin1 bin2 bin3 bin4
#1 101  263   53   11    1
#3 201  270   42    7   10
#5 301  268   57    0    0

注意:当有两个以上的组并将代码行数限制为一行时,这也可以作为一般解决方案使用split

即如果有很多组,我们可以取最后两个子字符串字符

split(data,  sub(".*(..)$", "\\1", data$ID))

-输出

#$`01`
#   ID bin1 bin2 bin3 bin4
#1 101  263   53   11    1
#3 201  270   42    7   10
#5 301  268   57    0    0

#$`02`
#   ID bin1 bin2 bin3 bin4
#2 102  276   42   12    0
#4 202  163  146    7    3
#6 302  233   33   59    4

【讨论】:

    【解决方案2】:

    您可以使用OneTwo 作为子集data 的行索引。

    DataOne <- data[One, ]
    DataTwo <- data[Two, ]
    DataOne
    
    #   ID bin1 bin2 bin3 bin4
    #1 101  263   53   11    1
    #3 201  270   42    7   10
    #5 301  268   57    0    0
    
    DataTwo
    #   ID bin1 bin2 bin3 bin4
    #2 102  276   42   12    0
    #4 202  163  146    7    3
    #6 302  233   33   59    4
    

    这将创建两个数据帧(DataOneDataTwo),保持原来的数据帧(data)不变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多