给定一个包含3列的data.frame
,我需要对属于列III的元素求和,给定两个条件:列I和列II必须具有相同的值(按行)。例如,如果我有这个data.frame:
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
答案 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
这将计算列III
和I
中每个值组合的列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