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

Che*_*til 7 r subset dataframe

在 中R,我尝试 使用存储在 中的元素data.frame对命名进行子集化。Datalist

数据

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)
Run Code Online (Sandbox Code Playgroud)

代码

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)
Run Code Online (Sandbox Code Playgroud)

问题

  • 首先, 中的元素list可以多于两个且不固定。甚至可以有超过 100 个元素。
  • 其次,我只想保留一个data.frame,它将存储使用 中的所有元素提取的所有子集数据list。如果有更多元素,比如说 100 个,那么我不想subset()对每个元素重复。

有没有比上面的代码更好的方法来解决这个问题?因为我的方法不够好,并且会影响性​​能。

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

hi-*_*zir 10

%in%应该做的伎俩:

subset(Data, Column_X %in% variableData)
Run Code Online (Sandbox Code Playgroud)

您还可以使用dplyr和过滤:

Data %>% filter(Column_X %in% variableData)
Run Code Online (Sandbox Code Playgroud)


lok*_*oki 5

经典的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
Run Code Online (Sandbox Code Playgroud)

它返回所有子集的列表。对于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
Run Code Online (Sandbox Code Playgroud)

但是,正如 @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
Run Code Online (Sandbox Code Playgroud)

“警告

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

此外,因此行的顺序将被保留。