在某些条件下对列的元素求和

时间:2014-08-11 16:17:05

标签: r sum

给定一个包含3列的data.frame,我需要对属于列III的元素求和,给定两个条件:列I和列II必须具有相同的值(按行)。例如,如果我有这个data.frame:

我是。二。 III

1 2 0.3

1 2 0.4

2 1 0.3

2 3 0.5

3 1 0.5

我希望将I = 1中的所有值加起来,其中II = 2; I = 2,II = 1; I = 2,II = 3

3 个答案:

答案 0 :(得分:1)

如果您可以将矩阵转换为data.frame

使用@Franks'数据集

d1 <- as.data.frame(d)
library(dplyr)
d1%>% 
group_by(`I`, `II`) %>% 
summarize(Sum=sum(`III`))
#     Source: local data frame [4 x 3]
#  Groups: I

#   I II Sum
# 1 1  2 0.7
# 2 2  1 0.3
# 3 2  3 0.5
# 4 3  1 0.5

答案 1 :(得分:1)

如果您的数据框为df,请将@ beginneR的评论转换为答案:

aggregate(III ~ I + II, df, sum)
##   I II III
## 1 2  1 0.3
## 2 3  1 0.5
## 3 1  2 0.7
## 4 2  3 0.5

这将计算列IIII中每个值组合的列II中元素的总和。

您的问题有点令人困惑,因为您引用的是3列数据帧,然后是5X5矩阵。矩阵与数据框不同。

答案 2 :(得分:0)

# Read in sample matrix (3 columns, 5 rows)
d<-as.matrix(read.table(text="
I II III
1 2 0.3
1 2 0.4
2 1 0.3
2 3 0.5
3 1 0.5", header=T))

# get all sums by unique groupings of column I and II
all_group_sums <- tapply(d[,'III'], paste0(d[,'I'], d[,'II']), sum)

# conditions you're interested in
of_interest <- c("12", "21", "23")

# filter tapply result by conditions of interest
all_group_sums[of_interest]

# 12  21  23 
#0.7 0.3 0.5 

或者与上面相同,只需一行:

tapply(d[,'III'], paste0(d[,'I'], d[,'II']), sum)[c("12", "21", "23")]
# 12  21  23 
#0.7 0.3 0.5