我的数据集有两列,如下所示:
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,只使用第一个元素
答案 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