2016-07-26 64 views
1

這個問題似乎很基本,但我一直未能找到答案。更好的方法通過引用independ添加data.frame列

我想通過引用它們的indeces來將data.frame的列添加在一起。

假設我要添加列1,2和4

df <- data.frame(
    a=rep(1, 5), 
    b=rep(2, 5), 
    c=rep(3, 5), 
    d=rep(4, 5) 
) 

我知道明確提到的列名,我可以做

> df$a + df$b + df$d 
[1] 7 7 7 7 7 

並參照的indeces我可以做

> df[1] + df[2] + df[4] 
    a 
1 7 
2 7 
3 7 
4 7 
5 7 

但是,上面的索引選項要求我寫出data.frame的名稱f或我想添加的每一列。

有沒有一種方法可以將這些列添加到一起,而只是參考indeENTS和data.frame一次?

回答

1

您可以使用rowSums函數並通過在df[, ]中設置列號向量來引用列。

rowSums(df[, c(1,2,4)] 
[1] 7 7 7 7 7 
1

或者內data.table

dt[, sum := rowSums(.SD), .SDcols = c(1, 2, 4)] 
dt[, sum := rowSums(.SD), .SDcols = c('a', 'b', 'd')] 
1
with(df, a + b + d) 
[1] 7 7 7 7 7 
+1

雖然不恰當,這是很好的瞭解。 – Warner

1

另一種解決方案使用data.table

require(data.table) # Load package 
dt <- data.table(df) # Convert to data.table 
dt[, a + b + d]  # Sum columns 
[1] 7 7 7 7 7 
1

另一種選擇是

Reduce(`+`, df[-3]) 
#[1] 7 7 7 7 7 

或者@PierreLafortune

對我當前的問題變體
df$a + df$b + df$d 
#[1] 7 7 7 7 7 
+1

我喜歡'Reduce'方法,因爲我不限於添加。我也可以做'/'和'*'。我不確定我是否理解這個函數是如何工作的。當我做'Reduce(sum,df [-3])''我得到35,但是當我做'Reduce(max,df [-3])'我得到4 – Warner

+0

@Warner有一些函數可以用' Reduce'和'sum'會得到整個和而不是rowwise'sum'。 – akrun

+0

akrun你知道一個函數,很可能來自一個包,它的工作方式就像'Reduce()',但速度更快嗎?我使用'Reduce'來合併一個像這樣的'Reduce(function(x,y){full_join(x,y)},masterlist)'數百個數據框的列表''。我知道這是一個有點偏離主題,但它可能但不錯,有一個像'減少'的算術運算的替代方案。 – Warner