将“for”循环与 if-else 语句相结合,每个“if”语句中都有多个条件

Posted

技术标签:

【中文标题】将“for”循环与 if-else 语句相结合,每个“if”语句中都有多个条件【英文标题】:Combining 'for' loop with if-else statements with multiple conditions inside each 'if' statement 【发布时间】:2017-10-29 00:15:12 【问题描述】:

我有一个包含 4 个字符列的数据框

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,否则值为“分贝”是 1。

我编写了以下代码,它可以运行,但无论它是否应该为 0,它都将 db 的所有值都设为 1。如果我删除了 'if' 条件中的 'or' 条件,则代码可以正常工作。你觉得哪里不对?我使用“包含”的方式也正确吗?感谢您的帮助!

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

【问题讨论】:

您的数据没有变量2016H2 - 也许这就是问题所在。 旁注:我不知道你的循环出了什么问题。但是,您应该确保您的示例 df 可以被复制粘贴(按照您指定的方式,它会产生错误)并且它包含您的特定情况(例如,如果我看到“所有字段都是空的”则丢失对) 你能添加预期的结果吗? 感谢您的 cmets。 Agstudy,所需的结果是 db 我之前应该澄清一下 - 我的数据框实际上有 41 列和 600 行。为简单起见,我只在此处粘贴了与我的问题相关的列子集。就我的数据框中的列顺序而言,有问题的 4 列是 28:31。 【参考方案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

【讨论】:

谢谢!这是一个优雅的解决方案,并达到了预期的结果。我对其中一些函数不熟悉,但我一直在慢慢解码它,现在更好地理解代码。我还有以下问题 1.我了解 grepl 的使用,您如何使用 apply 来实现值 0 或 1。我了解通过 'apply' 中的参数 '1' 你正在浏览每一列,不会只粘贴字符串的所有值每列在一起?你怎么还得 0 和 1? 2.我的数据框实际上有 41 列和 600 行。为简单起见,我只在此处粘贴了与我的问题相关的列子集。就我的数据框中的列顺序而言,有问题的 4 列是 28:31。可以在这些选定的列上运行应用程序吗?我应该在我原来的问题中澄清我的数据框的实际结构 - 道歉! @user3816784 apply 调用只是concatenating rows of a data frame 的一种方式。 1 表示逐行应用(例如,2 将是逐列)。 grepl 给你一个逻辑向量(这就是 l 的意思)。我添加了+0L 将逻辑转换为整数,因为您不想要真/假而是 1/0。 @user3816784 (!grepl("Utility grid|^$", apply(df[,28:31], 1, paste, collapse="")))+0L 将在第 28 到 31 列的子集上运行它。

以上是关于将“for”循环与 if-else 语句相结合,每个“if”语句中都有多个条件的主要内容,如果未能解决你的问题,请参考以下文章

For 循环首先打印 if-else 语句的错误分支

条件判断及循环

python基础5 if-else流程判断,for循环和while循环

JS基础整理(if-else for循环)

将添加到注册表与 if-else 结合使用

Java 基本语法---流程控制