2017-05-28 117 views
1

我有一個數據幀有4分字符列結合「for」循環使用的if-else與多個條件語句中的每個「如果」語句

df <- data.frame(2016=c("light", "", "", "", ""), 2017=c("radio", "", "", "", ""), after2017=c("", "Utility grid connection for lighting", "", "", "light"), dkcs=c("", "", "TV", "TV", "")) 

我想創建一個第5列如下,「DB」例如,如果該行的所有4列都爲空,或列的值「包含」字符串「Utility grid」,則值爲0,否則值「db」爲1.

我寫了以下內容代碼運行,但它將db的所有值都設爲1,而不管它是否應該爲0.如果我在'if'條件中刪除'或'條件,代碼將正常工作。你認爲什麼是錯的?還有,我使用「包含」正確的方式?我感謝您的幫助!

for(i in 1:nrow(df)) { 

    if(df$2016[i]!= "" | df$2016H2[i]!= "Utility grid.") { 
    df$db[i] <- 1 
    } else if (df$2017[i]!="" | df$2017[i]!="Utility grid.") { 
    df$db[i] <- 1 
    } else if (df$after2017[i]!="" | df$after2017[i]!="Utility grid.") { 
    df$db[i] <- 1 
    } else if (df$dkcs[i]!="" | df$dkcs[i]!="Utility grid.") { 
    df$db[i] <- 1 
    } 
    else df$db[i] <- 0 
} 
+0

你的數據不具有可變'2016H2' - 或許這是它是怎麼了。 –

+0

附註:我不知道你的循環出了什麼問題。然而,你應該確保你的例子'df'可以被複制粘貼(你指定的方式,它會產生一個錯誤),並且它包括你的特定情況(例如,「如果我看到所有的字段是空的」右) – lukeA

+0

你可以添加預期的結果嗎? – agstudy

回答

1

這裏的另一種方法:

df <- data.frame(
    `2016`=c("light", "", "", "", "", ""), 
    `2017`=c("radio", "", "", "", "", ""), 
    after2017=c("", "Utility grid connection for lighting", "", "", "light", ""), 
    dkcs=c("", "", "TV", "TV", "", ""), 
    check.names=F) 
df$db <- (!grepl("Utility grid|^$", apply(df, 1, paste, collapse="")))+0L 
df 
# 2016 2017       after2017 dkcs db 
# 1 light radio           1 
# 2    Utility grid connection for lighting  0 
# 3             TV 1 
# 4             TV 1 
# 5           light  1 
# 6              0 
+0

謝謝!這是一個優雅的解決方案,可以達到理想的效果。我對這些功能中的一些不熟悉,但我一直在慢慢解碼它,並且現在更好地理解代碼。我仍然有以下問題 – user3816784

+0

1.我瞭解了grepl的用法,你如何使用apply來實現值0或1.我明白,通過在'apply'中的參數'1',你正在經歷每一列,不會粘貼每個列的所有值一起?你還是如何得到0和1? – user3816784

+0

2.我的數據幀實際上有41列和600行。爲了簡單起見,我只在這裏粘貼了與我的問題相關的一組子列。根據我的數據框中列的順序,問題的4列是28:31。應用程序可以在這些選定的列上運行嗎?我應該在我的原始問題中澄清我的數據框的實際結構 - 道歉! – user3816784