2014-03-28 118 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??? 
相關問題