2017-10-17 98 views
1

比方說,我有這個簡單的數據幀:的R - 子集,包括計算列

df <- data.frame(x=c(1,3,3,1,3,1), y = c(2,2,2,2,2,2),z = c('a','b','c','d','e','f')) 

> df 
    x y z 
1 1 2 a 
2 3 2 b 
3 3 2 c 
4 1 2 d 
5 3 2 e 
6 1 2 f 

我想子集,其中x= 3,僅返回列xy和包括計算科拉姆x+y
我可以得到前兩件事情,但我無法得到caclulated列也出現。

df[df$x==3,c("x","y")] 

我如何能做到這一點,但只使用base R

+3

嘗試'變換(DF [DF $ X = = 3,C( 「X」, 「Y」),新= X + Y)'或'mutate'庫(dplyr); df%>%select(x,y)%>%filter(x == 3)%>%mutate(new = x + y)' – akrun

回答

1

住在base,在子集之前做一個rowSums

df$xy <- rowSums(df[, c("x", "y")]) 
df[df$x == 3, c("x", "y", "xy")] 

# x y xy 
# 2 3 2 5 
# 3 3 2 5 
# 5 3 2 5 

就我個人而言,我更喜歡dplyr方法,@akrun對您的問題發表了評論。

+0

我不能使用'dplyr'因爲電腦上的安全。 'rowSum()'看起來不錯,比我迄今爲止做得好得多。 我喜歡'transform()',因爲它允許我在相同的代碼塊中完成它。 – jmich738

1

你也可以這樣做

df <- data.frame(x=c(1,3,3,1,3,1), y = c(2,2,2,2,2,2),z = c('a','b','c','d','e','f')) 

df$z <- ifelse(df$x == 3, (df$x + df$y), df$y) 
df 

    x y z 
1 1 2 2 
2 3 2 5 
3 3 2 5 
4 1 2 2 
5 3 2 5 
6 1 2 2