根据另一列计算某一列的总和

5

I have a data frame:

Y  X1  X2  X3
1   1   0  1
1   0   1  1
0   1   0  1
0   0   0  1
1   1   1  0
0   1   1  0

我希望对Y列中所有与其他列等于1的行求和,即 sum(Y=1|Xi =1)。例如,对于列X1s1 = sum(Y=1|Xi =1) =1 + 0 +1+0 =2

Y  X1   
1   1   

0   1    

1   1    
0   1   
对于 X2 列,s2 = sum(Y=1|Xi =1) = 0 +1+0 =1
    Y   X2  

    0   1   

    1   1    
    0   1     

对于X3列,s3 = 在Xi=1时,sum(Y=1)的总和 = 1+1+0+0 = 2

    Y    X3
    1    1
    1    1
    0    1
    0    1

我大致想使用apply(df, 2, sum)来处理数据框的列,但我不知道如何基于Xi对每一列进行子集化然后计算Ysum。感谢任何帮助!


你愿意手动逐列完成这个任务,还是希望自动处理一大堆列? - user3603486
我希望自动完成一大堆列。 - Jassy.W
2
你可能想在下次使用dput函数,以便于回答者更易于重现你的数据。可以参考以下指南:https://dev59.com/eG025IYBdhLWcg3whGSx#28481250 - Frank
3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
6
有很多方法可以实现这个目标。其中一种是基于你想要的列获取一个子集:
sum(df[df$X1==1,]$Y)
这对您应该有效。

4

当Y*X等于1时,您可以使用colSums和计数。我认为您对X2列的期望输出存在错误。第2行和第5行都包含Y和X2的值为1。总和应该是2。

x=read.table(text="Y  X1  X2  X3
1   1   0  1
1   0   1  1
0   1   0  1
0   0   0  1
1   1   1  0
0   1   1  0",header=TRUE, stringsAsFactors=FALSE)

colSums(x[,-1]*x[,1])

X1 X2 X3 
 2  2  2
您可以使用crossprod(x[,1],as.matrix(x[,-1]))
     X1 X2 X3
[1,]  2  2  2

1
或者 x[,1] %*% as.matrix(x[,-1]) - Frank

2

这里还有一种方法,你可以修改它来求和对应于1、0或其他值的元素。

sapply(x[,-1], function(a) sum(x$Y[a == 1]))
#X1 X2 X3 
# 2  2  2 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,