【问题标题】:How to assign rowsums of a dataframe in R along a column in the same dataframe如何沿同一数据框中的列分配 R 中数据框的行和
【发布时间】:2019-08-22 11:51:23
【问题描述】:

我在 R 中有以下数据框

 DF1<-data.frame("S"=c("A", "B", "C"))
 namelist<-c("A", "B", "C")
 DF1[c("A", "B", "C")]<-c(1,2,3)
 DF1$B<-DF1$B*2

我创建了一个新列 Sum 如下

  DF1$Sum<-0

生成的数据框如下

 S A B C Sum
 A 1 2 1   0
 B 2 4 2   0
 C 3 6 3   0

我希望 Sum 中的值以这样的方式填充,即 Sum 的 A 行的值将等于 A 列中条目的总和,对于 B 和 C 也是如此。结果应该如下

  S A B C Sum
1 A 1 2 1   6
2 B 2 4 2   10
3 C 3 6 3   6

我试过下面的代码

 for( i in 1:nrow(DF1)){
  for( j in namelist){
 DF1$Sum[DF1$S[j][i]]=sum(DF1[,j])
  }}

我没有得到想要的结果。 我得到以下输出。我请求有人在这里帮助我。

  S A B C Sum
1 A 1 2 1   0
2 B 2 4 2   0
3 C 3 6 3   0

【问题讨论】:

  • 是的,应该。为错字道歉。已更正相同

标签: r dataframe for-loop rowsum


【解决方案1】:

dplyr 的一种可能是:

DF1 %>%
 mutate(sum = colSums(.[-1]))

  S A B C sum
1 A 1 2 1   6
2 B 2 4 2  12
3 C 3 6 3   6

或者和base R一样:

DF1$sum <- colSums(DF1[-1])

【讨论】:

  • @David Arenburg 一个很好的简化,谢谢 :) 老实说,dplyr 这只是一个固定,在这里它真的不重要。
【解决方案2】:

这是一个实现目标的快速循环

for(i in 1:nrow(DF1)){
DF1$SUM[i] <- sum(DF1[,i+1])
}

【讨论】:

    【解决方案3】:

    这是一种更通用的方法来处理任意字符序列,即如果字符与列的顺序不同

    tmp=colSums(DF1[,-1])
    tmp2=data.frame(S=names(tmp),Sum=tmp)
    merge(DF1,tmp2,by="S")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-01
      • 1970-01-01
      • 2015-07-12
      • 2016-12-11
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多