我必须根据特定条件从数据框中选择一堆数据。数据框看起来大致如下:
F1 F2 D1 D2
1 A1 B1 1 0
2 A1 B1 1 1
3 A1 B1 0 0
4 A1 B2 1 0
5 A1 B2 0 0
6 A2 B2 1 0
7 A2 B2 1 1
Fx
是因素,Dx
是数据值。我要做的是以下几点:
例如,
factors <- unique(data[D1==1 & D2 == 1, c("F1","F2")])
会给我第1步和第2步。
并且
data[data$F1 %in% factors$F1 & data$F2 %in% factors%F2,]
我越来越接近解决方案了,但是通过上面的示例数据,这将选择所有行。但是不应该选择第4行和第5行,因为它们不是完全匹配的。如何添加某种条件,要求%in%匹配发生在同一行?
我觉得这应该是一个常见的操作,因此R可能有一个聪明的方法来做到这一点。
任何想法????感谢。
答案 0 :(得分:1)
您可以使用data.table
包的索引来选择所有必须操作的行。
data <- data.table(data,key="F1,F2")
data[unique(data[D1 == 1 & D2 == 1,list(F1,F2)])]
答案 1 :(得分:0)
感觉就像tapply
和paste
的工作......例如,让我们将data2定义为与您的数据对象相同但是使用“Val”列(您没有说什么样的你可能想做的行操作,所以这只是为了帮助说明... ...
F1 F2 D1 D2 D3 D4 Val
1 A1 B1 1 1 0 1 7
2 A1 B1 1 0 1 1 19
3 A2 B1 1 1 1 1 43
现在查看以下命令:
tapply(data2$Val,paste(data2$F1,data2$F2,sep="~"),sum)
你应该得到这个输出:
A1~B1 A2~B1
26 43
应该很清楚,R正在计算F1和F2的每种可能组合的Val之和(实际上,正如命令所示,它看着F1和F2的粘贴相同的东西)......对于A1~B1,总和是26(7 + 19),对于A2~B1,总和是43(只有一个这样的行)。在tapply中将sum
更改为length
,您将获得此类行的数量,依此类推。
希望这有助于......:)
编辑:刚刚看到您的修改。如果您只是在数据中的所有行,其中F1和F2的组合是您的因子对象中列出的F1和F2的组合之一......您可以使用paste
:
data[paste(data$F1,data$F2,sep="~") %in% paste(factors$F1,factors$F2,sep="~"),]
sep="~"
并非严格需要,只是习惯的力量。上面这行应该给你你想要的行。如果要对具有特定F1 / F2组合的每个行子集执行函数,请使用tapply,如上所述:)
数据2的输入在下面是为了方便起见:
structure(list(
F1 = structure(c(1L, 1L, 2L), .Label = c("A1", "A2"), class = "factor"),
F2 = structure(c(1L, 1L, 1L), .Label = "B1", class = "factor"),
D1 = c(1L, 1L, 1L), D2 = c(1L, 0L, 1L), D3 = c(0L, 1L, 1L),
D4 = c(1L, 1L, 1L), Val = c(7, 19, 43)),
.Names = c("F1", "F2", "D1", "D2", "D3", "D4", "Val"),
row.names = c(NA, -3L), class = "data.frame")