在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
。有没有比上面代码更好的方法来解决这个问题?由于我的方法不够好而且会受到性能影响。
任何建议都会有所帮助,谢谢。
答案 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
)
此外,将保留您的行的顺序。