感觉就像一个工作......例如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 :)
为方便起见,data2 的 dput 如下所示:
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")