R 如何编写if语句,在数据框中创建新列的多个条件

R 如何编写if语句,在数据框中创建新列的多个条件,r,R,我有以下脚本,用于比较数据帧中两列中的值,并根据结果返回/创建一个新列(多个条件) 循环运行,但不返回包含结果的新列。我会在这里调用ifelse()函数来解释矢量化,但是我不确定如何向它传递多个条件(看起来本质上是二进制的) 数据只是为列1和列2随机化的值N和Y。因此,我希望(针对DF中的每一行)执行以下操作: 如果第1列为n,第2列为n,则在新的第3列中返回n 如果列1为n,列2为y,则在新列3中返回y 如果列1为y,列2为n,则在新列3中返回y 如果第1列为y,第2列为y,则在新的第3列中

我有以下脚本,用于比较数据帧中两列中的值,并根据结果返回/创建一个新列(多个条件)

循环运行,但不返回包含结果的新列。我会在这里调用ifelse()函数来解释矢量化,但是我不确定如何向它传递多个条件(看起来本质上是二进制的)

数据只是为列1和列2随机化的值N和Y。因此,我希望(针对DF中的每一行)执行以下操作:

  • 如果第1列为n,第2列为n,则在新的第3列中返回n
  • 如果列1为n,列2为y,则在新列3中返回y
  • 如果列1为y,列2为n,则在新列3中返回y
  • 如果第1列为y,第2列为y,则在新的第3列中返回y

注:n=no和y=yes

您可以简单地使用数据表子集。。。 首先初始化列,然后根据您的条件为其赋值。所以这里DF是我的数据帧,TEMP是我用以分类新ComColumn“control TEMP”的参数

DF$Control\u Temp试试这个(使用dplyr软件包):


类似于雅各布·奥多姆的帖子,我喜欢订阅。我认为将所有内容设置为“Y”,然后绘制出“N”s,会更简洁一些:


LeaseDF\u地区$HLD\u标准\u 3只需使用
数据即可。表

library(data.table)
dt <- data.table(C1 = sample(c('Y','N'), 10, replace=T), C2 = sample(c('Y','N'), 10, replace=T))

dt[, C3 := ifelse(C1 == 'Y' | C2 == 'Y', 'Y', 'N')]

nrow
返回唯一值<代码>i
不会出现在脚本中的任何位置;这不是代码问题的详尽列表。。。尝试添加一点数据以及您的具体目标是什么,这将更容易帮助您。尝试此方法(使用dplyr包):LeaseDF_Region%>%mutate(HLD_Criteria_3=ifelse(LeaseDF_Region$HLD_Criteria_1==“N”和LeaseDF_Region$HLD_Criteria__2==“N”,“N”,ifelse(…)可能是
LeaseDF_Region$HLD_Criteria_3@cath请参见上面的尼斯用法调用
'&
作为函数调用而不是内联运算符。我总是知道语法在那里,但总是忘记它如何以不同的方式表示代码。@r2evans Thx。我认为这种方式更具表现力,我喜欢在fu中添加注释NcTeCo调用,有点像一个迷你文档字符串。否则它就像100行,我不确定我在看什么。我想评论一下,我有时希望R支持“DoStand”概念。然后我意识到,它在代码中间(大部分地方)都是文字字符串。可以很好地达到这个目的,尽管对性能影响很小。@r2evans是的,我喜欢在键入时弹出docstring,例如在Python中。我想我可以研究RStudio之类的工具来获得类似的结果,但我通常只使用谷歌风格的符号来描述函数,并在函数中键入以查看源代码,顶部有文档。如果出现问题,则更容易看到您是否使用
NA
而不是
“Y”
初始化变量。谢谢@martin..这是有意义的。这是完全有意义的。结果是
LeaseDF\u Region$HLD\u Criteria\u 3
DF$Control_Temp <- NA
DF$Control_Temp[DF$TEMP <= 50 & DF$TEMP2 == -1] <- 'Y'
DF$Control_Temp[DF$TEMP > 50 & DF$TEMP <= 100 & DF$TEMP2 == -1] <- 'N'
DF$Control_Temp[DF$TEMP > 100 & DF$TEMP2 == -1 ] <- 'Y'
LeaseDF_Region %>% mutate(HLD_Criteria_3 = 
                            ifelse(LeaseDF_Region$HLD_Criteria_1 == "N" &
                                   LeaseDF_Region$HLD_Criteria_2 == "N", "N", 
                                   ifelse(LeaseDF_Region$HLD_Criteria_1 == "Y" & 
                                          LeaseDF_Region$HLD_Criteria_2 == "Y", "Y", 
                                          ifelse(...))))
LeaseDF_Region$HLD_Criteria_3 <- "Y" # Set all values to "Y"
index_n <- `&`(
    # Map out the "N" indexes with a boolean vector
    LeaseDF_Region$HLD_Criteria_1 == "N",
    LeaseDF_Region$HLD_Criteria_2 == "N"
)
LeaseDF_Region$HLD_Criteria_3[index_n] <- "N" # Assign "N" accordingly
library(data.table)
dt <- data.table(C1 = sample(c('Y','N'), 10, replace=T), C2 = sample(c('Y','N'), 10, replace=T))

dt[, C3 := ifelse(C1 == 'Y' | C2 == 'Y', 'Y', 'N')]
    C1 C2 C3
 1:  Y  N  Y
 2:  N  N  N
 3:  Y  Y  Y
 4:  Y  N  Y
 5:  N  N  N
 6:  N  Y  Y
 7:  N  N  N
 8:  Y  Y  Y
 9:  N  N  N
10:  N  Y  Y