我目前在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
在我的最终数据框中,我可能有几百个变量,都是二进制的。我想找到一种方法:
回到我的简单数据框示例,我的新数据框将如下所示:
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和更广泛的互联网。 菲尔
答案 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???