2014-03-28 87 views
1

我目前在R中有一个数据框,其中包含一个具有唯一标识符的变量,而其中的几个变量仅包含二进制响应(0或1)。总结列并将结果添加到数据框中R

我的数据帧的简化版本有两个例子行:

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. 指定列总和(1)到一个新的变量(在复制到每行总)
  3. 重复这在每个变量,所以我有n个变量,并在相同数量与合计新变量

回到我的简单的数据帧例如,我的新的数据帧会是什么样子:

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 
} 

(我在这里试图模仿一个for循环我在Stata,其中总变量与`i'_t产生的锯,但这似乎并没有工作在R.

我也试着申请:

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

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

任何建议将不胜感激,自然我已经广泛地看待了stackoverflow和更广泛的互联网。 菲尔

回答

2

你可以尝试:

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

用小编辑,即工作,谢谢!我需要通过仅指定列2和3来排除第一列:for(var in colnames(df [,2:3])){...,否则它尝试并且无法添加ID。 – Phil

+0

啊哈。固定。 :) –

+0

[-1]的作品也一样! – Phil

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)) 
+0

感谢您的帮助。最后一行似乎没有将列添加到数据框,它只是在控制台中生成输出。难道我做错了什么? – Phil

+0

你需要指定它 - 编辑 – user20650

+0

这是工作,谢谢。我有适当数量的'总'变量,可以很容易地用名称(df)< - c(“...”)重命名 – Phil

0

这是你数据帧DF充满因素。所以我选择了2 varibales男性和女性,并将其转换为数字

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??? 
相关问题