根据R中的另一个数据帧子集数据帧

时间:2014-02-22 02:59:02

标签: r

DF:

  y x
  F T
  F F
  T T
  T F

DF1:

 y z probs.x x probs.y   new
 F F    0.08 T     0.4 0.032
 F F    0.24 F     0.4 0.096
 F T    0.12 T     0.6 0.072
 F T    0.36 F     0.6 0.216
 T F    0.40 T     0.5 0.200
 T F    0.20 F     0.5 0.100
 T T    0.40 T     0.5 0.200
 T T    0.20 F     0.5 0.100

df和df1是两个数据帧。对于每行df,我想在df1中选择匹配的行,在“new”列中添加值,并将输出存储在这样的新数据帧中。

df_res:

  y x new
  F T .104
  F F .312
  T T .4
  T F .2

请帮助我!我已经在这方面做了很长时间了。表头将根据变量进行更改,因此请不要对表头进行硬编码。

感谢。

3 个答案:

答案 0 :(得分:2)

我不知道您的数据有多长,但这可能是一种方法。

df<- read.table(text="y x
F T
F F
T T
T F",header=T,sep="")

df1 <- read.table(text="y z probs.x x probs.y   new
 F F    0.08 T     0.4 0.032
 F F    0.24 F     0.4 0.096
 F T    0.12 T     0.6 0.072
 F T    0.36 F     0.6 0.216
 T F    0.40 T     0.5 0.200
 T F    0.20 F     0.5 0.100
 T T    0.40 T     0.5 0.200
 T T    0.20 F     0.5 0.100", header=T, sep="")

df$yx <- paste0(df$y,df$x)
df1$yx <- paste0(df1$y, df1$x)

# Update automatically using the for loop

for (i in 1:4){
  new[i] <- sum(df1[which(df1[,7]==df[i,3]),6])
}

df$new <- new
df
      y     x         yx   new
1 FALSE  TRUE  FALSETRUE 0.104
2 FALSE FALSE FALSEFALSE 0.312
3  TRUE  TRUE   TRUETRUE 0.400
4  TRUE FALSE  TRUEFALSE 0.200

使用sapply

new <- sapply(1:4, function(x) sum(df1[which(df1[,7]==df[x,3]),6]))

答案 1 :(得分:1)

好像你想要的只是F,T组合。这很有效。否则你必须写得更清楚。

text=" y z probs.x x probs.y   new
 F F    0.08 T     0.4 0.032
 F F    0.24 F     0.4 0.096
 F T    0.12 T     0.6 0.072
 F T    0.36 F     0.6 0.216
 T F    0.40 T     0.5 0.200
 T F    0.20 F     0.5 0.100
 T T    0.40 T     0.5 0.200
 T T    0.20 F     0.5 0.100"

df<-read.table(text=text, header=T)
df_res<-aggregate(data=df, new~interaction(y,x),sum)

  interaction(y, x)   new
1       FALSE.FALSE 0.312
2        TRUE.FALSE 0.200
3        FALSE.TRUE 0.104
4         TRUE.TRUE 0.400

答案 2 :(得分:1)

以下是使用mergeplyr的答案。

请阅读您的示例data.frame

df1 <- read.table(text="y z probs.x x probs.y   new
 F F    0.08 T     0.4 0.032
 F F    0.24 F     0.4 0.096
 F T    0.12 T     0.6 0.072
 F T    0.36 F     0.6 0.216
 T F    0.40 T     0.5 0.200
 T F    0.20 F     0.5 0.100
 T T    0.40 T     0.5 0.200
 T T    0.20 F     0.5 0.100", header=T, sep="")

如果我理解,你的要求有2个步骤。首先是在df1中选择与df中的模式匹配的行。这可以通过merge来完成。你给的df对x和y都有True和False的所有组合。让我们留出一个,这样我们就可以看到效果:

df <- read.table(text="y x
F T
T T
T F",header=T,sep="")

df_merged <- merge(df, df1, all.y=F)

结果是一个新的data.frame,省略了x和y都是F的行。这相当于SQL数据库中的左连接。

      y     x     z probs.x probs.y   new
1 FALSE  TRUE FALSE    0.08     0.4 0.032
2 FALSE  TRUE  TRUE    0.12     0.6 0.072
3  TRUE FALSE FALSE    0.20     0.5 0.100
4  TRUE FALSE  TRUE    0.20     0.5 0.100
5  TRUE  TRUE FALSE    0.40     0.5 0.200
6  TRUE  TRUE  TRUE    0.40     0.5 0.200

问题的第二部分是对数据进行分组并对组应用总和。 Plyr是这种数据操作的绝佳工具:

library(plyr)
ddply(df_merged, .(y,x), function(df) c(new=sum(df$new)))

dd意味着我们正在提供data.frame并希望得到一个data.frame。下一个参数。(y,x)是一个带引号的表达式,它命名我们要分组的变量。结果如下:

      y     x   new
1 FALSE  TRUE 0.104
2  TRUE FALSE 0.200
3  TRUE  TRUE 0.400