我有以下数据帧,并希望从该数据帧返回索引,该数据帧对应于向量[1 1 1 1 0 0 1]。 FUNC。在这种情况下应该返回5。
1:0 0 1 1 0 0 1
2:1 0 1 1 0 0 1
3:2 0 1 1 0 0 1
4:0 1 1 1 0 0 1
5:1 1 1 1 0 0 1
6:2 1 1 1 0 0 1
7:0 0 2 1 0 0 1
如果我们有另一个由
组成的data.frame怎么办?1:0 0 2 1 0 0 1 == 7
2:0 1 1 1 0 0 1 == 4
2:2 0 1 1 0 0 1 == 3
4:2 0 1 1 0 0 1 == 3
5:2 1 1 1 0 0 1 == 6
我希望函数返回7,4,3,3,6。我想在不使用循环的情况下完成此任务。谢谢!
答案 0 :(得分:1)
对于第二个问题(也是第一个问题,因为你可以在数据框中添加你想要的任何行)问题:
mydf$rownum <- 1:nrow(mydf)
merge(mydf.sub, mydf, sort=F)[[8]]
产地:
[1] 7 4 3 3 6
或没有[[8]]
:
V1 V2 V3 V4 V5 V6 V7 rownum
1 0 0 2 1 0 0 1 7
2 0 1 1 1 0 0 1 4
3 2 0 1 1 0 0 1 3
4 2 0 1 1 0 0 1 3
5 2 1 1 1 0 0 1 6
如果您想要解决第一个问题的答案:
merge(rbind(mydf.sub, c(1, 1, 1, 1, 0, 0, 1)), mydf, sort=F)
产地:
V1 V2 V3 V4 V5 V6 V7 rownum
1 0 0 2 1 0 0 1 7
2 0 1 1 1 0 0 1 4
3 2 0 1 1 0 0 1 3
4 2 0 1 1 0 0 1 3
5 2 1 1 1 0 0 1 6
6 1 1 1 1 0 0 1 5
可重复数据(感谢Ananda的第一部分):
structure(list(V1 = c(0L, 0L, 2L, 2L, 2L), V2 = c(0L, 1L, 0L,
0L, 1L), V3 = c(2L, 1L, 1L, 1L, 1L), V4 = c(1L, 1L, 1L, 1L, 1L
), V5 = c(0L, 0L, 0L, 0L, 0L), V6 = c(0L, 0L, 0L, 0L, 0L), V7 = c(1L,
1L, 1L, 1L, 1L)), .Names = c("V1", "V2", "V3", "V4", "V5", "V6",
"V7"), class = "data.frame", row.names = c(NA, -5L))
答案 1 :(得分:0)
apply
可能对第一个问题有用:
# Actual reproducible data!
mydf <- structure(list(V1 = c(0L, 1L, 2L, 0L, 1L, 2L, 0L), V2 = c(0L,
0L, 0L, 1L, 1L, 1L, 0L), V3 = c(1L, 1L, 1L, 1L, 1L, 1L, 2L),
V4 = c(1L, 1L, 1L, 1L, 1L, 1L, 1L), V5 = c(0L, 0L, 0L, 0L,
0L, 0L, 0L), V6 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L), V7 = c(1L,
1L, 1L, 1L, 1L, 1L, 1L)), .Names = c("V1", "V2", "V3", "V4",
"V5", "V6", "V7"), class = "data.frame", row.names = c(NA, -7L))
myvec <- c(1, 1, 1, 1, 0, 0, 1)
将每一行与“myvec”对象进行比较。使用which
找出哪一行返回TRUE
。
apply(mydf, 1, function(x) all(x == myvec))
# [1] FALSE FALSE FALSE FALSE TRUE FALSE FALSE
which(apply(mydf, 1, function(x) all(x == myvec)))
# [1] 5