1

我有一个数据框,它是“两个方向”上 a、b 和 c 的所有可能排列

df1<-data.frame("x"=c("a","a","b"),"y"=c("b","c","c"),"A"=1:3 ,"B"=4:6,"C"=0,"T"=10:12)
df2<-data.frame("x"=df1$y,"y"=df1$x, "A"=df1$A,"B"=df1$B,"C"=df1$C,"T"=df1$T)
df<-rbind(df1,df2)
  x y A B C  T
1 a b 1 4 0 10
2 a c 2 5 0 11
3 b c 3 6 0 12
4 b a 1 4 0 10
5 c a 2 5 0 11
6 c b 3 6 0 12

我想用它来填充第二个空数据框

empty<-data.frame("x"=c("a","c"),"y"=c("b","a"),"A"=0,"T"=0)

  x y A T
1 a b 0 0
2 c a 0 0

从而产生:

filled<-data.frame("x"=c("a","c"),"y"=c("b","a"),"A"=1:2,"T"=10:11)

  x y A  T
1 a b 1 10
2 c a 2 11

我尝试了一个 for 循环但没有运气

for(i in 1:nrow(empty)
{
    if("x" == df$x && "y" == df$y)
    {
        empty[i,"A"]<-df$A 
        empty[i,"T"]<-df$T
    }
}

以及一篇关于填充矩阵但没有成功的答案。任何意见是极大的赞赏。

4

2 回答 2

2

您可以使用merge

merge(df[c("x","y","A","T")], empty[c("x","y")])
#   x y A  T
# 1 a b 1 10
# 2 c a 2 11

正如@mrdwab 指出的那样,您不需要创建一个empty保存最终数据的数据框。相反,让我们merge为您做到这一点。您所需要的只是一个 data.frame ,其中包含(x,y)您要提取的对组合:

extract.keys <- data.frame(x = c("a","c"), y = c("b","a"))
merge(df[c("x","y","A","T")], extract.keys)
于 2012-08-18T13:34:32.893 回答
2

将我的评论移至“答案”,我不确定最终目标是什么。对我来说,即使添加了排列的概念,这似乎也是一个子集的问题。也就是说,如果已经存在关于如何创建 " empty"的先验知识data.frame,我们可以简单地跳过创建该对象和必须合并的步骤,直接进行子集化。

鉴于aandb将给出六个排列作为变量xand y,并且知道我们只对组合a+b和感兴趣c+a,我们可以轻松地paste0()在列上使用xy与 which 进行测试。

使用df更新的问题:

df[paste0(df$x, df$y) %in% c("ab", "ca"), 
   names(df) %in% c("x", "y", "A", "T")]
#   x y A  T
# 1 a b 1 10
# 5 c a 2 11

当然,@flodel 的答案工作得很好,但我只是很困惑,为什么data.frame在按列和行索引进行子集化时需要费心创建一个空来填充就足够了。

更新

因为我还有其他工作要做,所以我决定做一些基准测试。结果如下:

library(rbenchmark)
benchmark(subsetting = df[paste0(df$x, df$y) %in% c("ab", "ca"), 
                 names(df) %in% c("x", "y", "A", "T")],
          merge.keys = merge(df[c("x","y","A","T")], 
                    data.frame(x = c("a","c"), 
                               y = c("b","a"))),
          merge.empty = merge(df[c("x","y","A","T")], empty),
          columns = c("test", "replications", "elapsed",
                      "relative", "user.self"))
#          test replications elapsed relative user.self
# 3 merge.empty          100   0.321 6.294118     0.324
# 2  merge.keys          100   0.387 7.588235     0.384
# 1  subsetting          100   0.051 1.000000     0.048
于 2012-08-18T18:27:11.343 回答