2015-10-15 19 views
0

我試圖找出一種方法在R中從多個列創建單個列。我想要做的是讓R遍歷所有行以獲得多個列,如果它在其中一列中找到正面結果,則將該結果傳遞到「汞合金」列(對不起,我不知道更好的詞)。將多個列的正面結果傳遞到r中的單個新列中

見下

x <- c(NA, NA, NA, NA, NA, 1) 
y <- c(NA, NA, 1, NA, NA, NA) 
z <- c(NA, 1, NA, NA, NA, NA) 

df <- data.frame(cbind(x, y, z)) 

df[, "compCol"] <- NA 

df 

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

玩具數據集我需要通過從每一列的積極結果的compCol列,同時改變陰性結果爲0。因此,它看起來像這樣。

x y z compCol 
1 NA NA NA  0 
2 NA NA 1  3 
3 NA 1 NA  2 
4 NA NA NA  0 
5 NA NA NA  0 
6 1 NA NA  1 

我知道大概需要嵌套在for循環的,如果else語句,但我在,我不理解的錯誤嘗試的結果的所有方式。

我嘗試了下面的一列

for (i in 1:length(x)) { 
    if (df$x[i] == 1) { 
    df$compCol[i] <- df$x[i] 
    } 
} 

但它並沒有在所有的工作。

我得到的消息 '錯誤的,如果(DF $ X [I] == 1){:缺失值,其中TRUE/FALSE需要的'

這是有道理的,但我看不出哪裏放TRUE/FALSE聲明

+0

請,不要做'data.frame(cbind(X,Y,Z))'。只需'data.frame(x,y,z)'。 – 2015-10-15 05:58:21

回答

0

我們可以使用max.col。通過檢查所選列是否大於0並且不是NA('ind')來創建邏輯矩陣。我們用max.col得到列索引的每一行,用「IND」的rowSums乘所以,如果有一排0真實值,這將是0。

ind <- df > 0 & !is.na(df) 
df$compCol <- max.col(ind) *rowSums(ind) 
df$compCol 
#[1] 0 3 2 0 0 1 

或者另一種選擇是pmaxcol(df)

do.call(pmax,col(df)*replace(df, is.na(df), 0)) 
#[1] 0 3 2 0 0 1 

注意相乘後:我創建的OP的崗位「compCol」之前使用的數據集。

+0

太優雅了!謝謝。 –

+0

@LlewMills感謝您的反饋。請考慮通過點擊投票旁邊的勾號來接受最佳解決方案。 – akrun

1

您還可以使用與NA去除重塑

library(dplyr) 
library(tidyr) 

df.id = df %>% mutate(ID = 1:n()) 

df.id %>% 
    gather(variable, value, 
     x, y, z, 
     na.rm = TRUE) %>% 
    left_join(df.id) 
相關問題