2013-02-02 30 views
4

我試圖根據相鄰列中的字符串的值將不同的功能應用於不同的行。我的數據幀看起來像這樣:R - 如何將不同的功能應用於列中的某些行

type size 
A  1 
B  3 
A  4 
C  2 
C  5 
A  4 
B  32 
C  3 

我想對類型A,B和C應用不同的函數來給第三列的列「size2」。例如,假設以下功能適用於A,B和C:

for A: size2 = 3*size 
for B: size2 = size 
for C: size2 = 2*size 

我能夠爲每種類型的做到這一點單獨使用此代碼

df$size2 <- ifelse(df$type == "A", 3*df$size, NA) 
df$size2 <- ifelse(df$type == "B", 1*df$size, NA) 
df$size2 <- ifelse(df$type == "C", 2*df$size, NA) 

不過,我可以」 t似乎不會刪除所有其他值,而是對所有類型都這樣做。我試圖用這個代碼的功能僅限制於那些被NA(即保留現有的值,並且僅在NA值填寫)值,但它並沒有使用此代碼的工作:

df$size2 <- ifelse(is.na(df$size2), ifelse(df$type == "C", 2*df$size, NA), NA) 

有沒有人有任何想法?是否有可能使用某種類型和語句 「is.na(DF size2個$)」 和 「ifelse(DF $類型== 」C「」?

非常感謝!

回答

2

如果你想你可以嵌套ifelse S:

df$size2 <- ifelse(df$type == "A", 3*df$size, 
         ifelse(df$type == "B", 1*df$size, 
          ifelse(df$type == "C", 2*df$size, NA))) 


# > df 
# type size size2 
#1 A 1  3 
#2 B 3  3 
#3 A 4 12 
#4 C 2  4 
#5 C 5 10 
#6 A 4 12 
#7 B 32 32 
#8 C 3  6 
+0

這工作,但是有點乏味,因爲我有32個不同的「類型」LOL – Thomas

+0

我提供了一個更緊湊的方法。如果嵌套深度超過4個,我會盡量避免嵌套'ifelse'。 Ray Waldin和我的方法非常相似。 –

0

這可以做到這樣的,每種類型創建獨立的邏輯載體:

As <- df$type == 'A' 
Bs <- df$type == 'B' 
Cs <- df$type == 'C' 
df$size2[As] <- 3*df$size[As] 
df$size2[Bs] <- df$size[Bs] 
df$size2[Cs] <- 2*df$size[Cs] 

,但更直接的方法是創建這樣一個單獨的查找表:

df$size2 <- c(A=3,B=1,C=2)[as.character(df$type)] * df$size 
4

這可能是一個強權更R-ISH(我打電話給我的數據幀,而不是因爲df「東風」逸'是一個常用的功能。

> facs <- c(3,1,2) 
> dat$size2= dat$size* facs[ match(dat$type, c("A","B","C")) ] 
> dat 
    type size size2 
1 A 1  3 
2 B 3  3 
3 A 4 12 
4 C 2  4 
5 C 5 10 
6 A 4 12 
7 B 32 32 
8 C 3  6 

match該函數被用來構建索引以提供給提取功能[

相關問題