求和列并将结果添加到R中的数据帧

时间:2014-03-28 15:09:34

标签: r for-loop sum

我目前在R中有一个数据框,其中包含一个带有唯一标识符的变量,其中几个变量只包含二进制响应(0或1)。

我的数据框的简化版本,包含两个示例行:

c.names <- c("ID", "male", "female")
df <- c("ADH0004", 0, 1,
        "ADH0005", 1, 0)
df <- matrix(df, nrow = 2, byrow = T)
df <- as.data.frame(df)
names(df) <- c.names
df

在我的最终数据框中,我可能有几百个变量,都是二进制的。我想找到一种方法:

  1. 获取每个变量的列总和,
  2. 将列sum(1。)分配给新变量(复制到每行的总数)
  3. 在每个变量上重复这个,这样我就有了n个变量,以及总数相同的新变量数。
  4. 回到我的简单数据框示例,我的新数据框将如下所示:

    c.names <- c("ID", "male", "female", "male_t", "female_t")
    df <- c("ADH0004", 0, 1, 1, 1,
            "ADH0005", 1, 0, 1, 1)
    df <- matrix(df, nrow = 2, byrow = T)
    df <- as.data.frame(df)
    names(df) <- c.names
    df
    

    一次为一个变量执行此操作很容易(即使对我而言)。我只想:

    df$male_t <- sum(df$male)
    

    我可以手动为每个变量执行此操作,但我希望最终可以达到一百个,所以我想循环使用它。我不介意使用for循环(而不是应用),如果这更容易,因为我有相对较少的循环要做,因此编码的简易性优先于代码的绝对速度。尽管如此,我已经尝试了申请和方法。

    有:

    varlist <- c("male", female")
    for (i in varlist) {
      df$i_t <- df$i
    }
    

    (我在这里尝试模拟我在Stata中看到的for循环,其中总变量是用`i'_t生成的,但这似乎在R中不起作用。

    我也试过申请:

    apply(df[c("male", "female")], MARGIN = 2, sum)
    

    这让我更接近我想要的结果,但我不知道如何将数据框中的列总和保存为新列,而不是像现在一样简单地输出到控制台。

    任何建议都会受到高度赞赏,我自然而然地看到了stackoverflow和更广泛的互联网。 菲尔

3 个答案:

答案 0 :(得分:2)

你可以尝试:

   for(var in colnames(df)[-1]) {
     df[[paste0(var, '_t')]] <- sum(df[[var]])
   }

答案 1 :(得分:2)

# Your columns 2 & 3 are character - convert to numeric
df[,2:3] <- sapply(df[,2:3] , as.numeric)

# Get column totals for all variables except the first
c <- colSums(df[-1])

# Add to df:  c is transposed so is added as columns
# values of c are recycled, so added to all rows of df
df <- data.frame(df , t(c))

答案 2 :(得分:0)

这个数据框df充满了各种因素。所以我选择了2个男性和女性变量并将它们转换为数字

df[,c(2,3)] <- apply(df[,c(2,3)],2,as.numeric)

然后将这两个变量加起来

cbind(df,as.data.frame(t(colSums(df[,c(2,3)])))) # Is it right result???