2017-05-28 121 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