多个if循环条件并在列中引用输出

时间:2017-07-10 12:34:25

标签: r if-statement

我的数据集有两列,如下所示:

 x1     | x2
ontime  |ontime
Alate   |ontime
ontime  |Blate
Alate   |Blate

我想要的输出是

  x12
ontime
Alate
Blate
Alate

我试图编写多个if循环:

 df$x12<- if(df$x1=='Alate' & df$x2=='ontime')
 {
 print('Alate')
 }else if(df$x1=='ontime' & df$x2=='Blate')
 {
 print('Blate')
 }else if(df$x1=='Alate' & df$x2=='Blate')
 {
 print('Alate')
 }else 
 print('ontime')

但它不起作用它只是打印&#34; ontime&#34;对于所有带警告的行:

  

条件的长度> 1,只使用第一个元素

4 个答案:

答案 0 :(得分:3)

此方法正在提升David's suggestion以使用use List::Util 'any'; my $text_file = '/homedir/report'; my @ICC2 = do { open my $fh,'<', $text_file or die qq{Unable to open "$text_file" for input: $!}; <$fh>; }; chomp @ICC2; my ( $address ) = split /\n/, $address[6608], 2; if ( any { $_ eq $address } @ICC2 ) { print "This address is found\n" } else { print "No match is found for this address\n"; } ,但会将其扩展为使用任意订单。

David观察到pmin()始终排在第一位,然后是Alate,最后是Blate。但是,不能理所当然地认为所请求的订单与字母顺序相同。但是通过使用有序因子,可以针对任意顺序扩展该方法:

ontime
library(data.table)
# Specify the priority
prio <- c("Alate", "Blate", "ontime")
# coerce to data.table, convert columns to ordered factors, using the same levels,
# pick the value with the higher priority (lower level number) 
data.table(DF)[, c("x1", "x2") := lapply(.SD, ordered, levels = prio)][, x12 := pmin(x1, x2)][]

此方法可避免嵌套 x1 x2 x12 1: ontime ontime ontime 2: Alate ontime Alate 3: ontime Blate Blate 4: Alate Blate Alate 表达式或多次选择性更新。

数据

ifelse()

答案 1 :(得分:1)

链接ifelse()的一种方式:

数据:

x1 <- c("ontime", "Alate", "ontime", "Alate")
x2 <- c("ontime", "ontime", "Blate", "Blate")
df <- data.frame(x1, x2)
> df
      x1     x2
1 ontime ontime
2  Alate ontime
3 ontime  Blate
4  Alate  Blate

然后你可以写:

df$x3 <- ifelse(x1 == "Alate" & x2 == "ontime", "Alate",
                ifelse(x1 == "ontime" & x2 == "Blate", "Blate",
                       ifelse(x1 == "Alate" & x2 == "Blate", "Alate", "ontime")))

> df
      x1     x2     x3
1 ontime ontime ontime
2  Alate ontime  Alate
3 ontime  Blate  Blate
4  Alate  Blate  Alate

答案 2 :(得分:1)

首先,您应该使用dput发布数据集示例。 至于你的代码,你必须知道R是矢量化的,因此警告。 if语句只是尝试将df$x1的一个elemet与'Alate'等进行比较,但该向量包含许多元素。解决方案是使用ifelse,它是矢量化的。

dat <- read.table(text = "
x1|x2
ontime|ontime
Alate|ontime
ontime|Blate
Alate|Blate
", header = TRUE, sep = "|", stringsAsFactors = FALSE)

dat$x12 <- ifelse(dat$x1=='Alate' & dat$x2=='ontime', 'Alate',
    ifelse(dat$x1=='ontime' & dat$x2=='Blate', 'Blate',
    ifelse(dat$x1=='Alate' & dat$x2=='Blate', 'Alate', 'ontime')))

dat

另请注意,我已更改数据框的名称,因为df已经是R函数的名称。

答案 3 :(得分:1)

如果您要使用的语句仅适用于长度为1的逻辑向量。那么也许根本不使用if。

x12 <- df$x1=='Alate' & df$x2=='ontime'
df[x12, 'x12'] <- 'Alate'

x12 <- df$x1=='ontime' & df$x2=='Blate'
df[x12, 'x12'] <- 'Blate'

x12 <- df$x1=='Alate' & df$x2=='Blate'
df[x12, 'x12'] <- 'Alate'

df[is.na(df)] <- 'ontime'

> df
      x1     x2    x12
1 ontime ontime ontime
2  Alate ontime  Alate
3 ontime  Blate  Blate
4  Alate  Blate  Alate