基于列表中的元素的子集数据

时间:2017-07-27 20:27:06

标签: r dataframe subset

R中,我尝试使用存储在data.frame中的元素对名为Data的{​​{1}}进行子集化。

数据

list

代码

Data <- read.table(text = "  Data_x  Data_y  Column_X 
                                -34      12       A
                                -36      20       D
                                -36      12       E
                                -34      18       F
                                -34      10       B
                                -35      24       A
                                -35      16       B
                                -33      22       B
                                -33      14       C
                                -35      22       D", header = T)

问题

  • 首先,variableData <- list("A", "B") subsetData_1 <- subset(Data, Column_X == variableData[1]) subsetData_2 <- subset(Data, Column_X == variableData[2]) subsetData <- rbind(subsetData_1, subsetData_2) 中的元素可以多于两个,并且不是固定的。甚至可以有超过100个元素。
  • 其次,我想只保留一个list,它将存储使用data.frame中所有元素提取的所有子集数据。如果有更多元素,让我们说100,那么我不想为每个元素重复list

有没有比上面代码更好的方法来解决这个问题?由于我的方法不够好而且会受到性能影响。

任何建议都会有所帮助,谢谢。

2 个答案:

答案 0 :(得分:3)

%in%应该这样做:

subset(Data, Column_X %in% variableData)

您还可以使用dplyr并过滤:

Data %>% filter(Column_X %in% variableData)

答案 1 :(得分:3)

经典lapply

x <- lapply(variableData, function(x){subset(Data, Column_X == x)})
x
# [[1]]
# Data_x Data_y Column_X
# 1    -34     12        A
# 6    -35     24        A
# 
# [[2]]
# Data_x Data_y Column_X
# 5    -34     10        B
# 7    -35     16        B
# 8    -33     22        B

它返回所有子集的列表。要rbind所有这些列表元素

do.call(rbind, x)
#   Data_x Data_y Column_X
# 1    -34     12        A
# 6    -35     24        A
# 5    -34     10        B
# 7    -35     16        B
# 8    -33     22        B

然而,正如@Frank指出的那样,您可以在代码中使用基本子集:

Data[Data$Column_X %in% variableData,]
#   Data_x Data_y Column_X
# 1    -34     12        A
# 5    -34     10        B
# 6    -35     24        A
# 7    -35     16        B
# 8    -33     22        B
  

&#34;警告

     

这是一种便于交互使用的便利功能。对于编程,最好使用标准的子集函数,如[,特别是参数子集的非标准评估可能会产生意想不到的后果。&#34; (?subset

此外,将保留您的行的顺序。