gpt4 book ai didi

r - %in%, == 或其他东西来比较多个值

转载 作者:行者123 更新时间:2023-12-05 05:20:55 26 4
gpt4 key购买 nike

我想我仍然不太清楚 R 如何处理向量化语句中的各个元素。

我有以下代码

df1$flag <- ifelse(df1$year < 2013 &
df1$year == df2$year &
as.character(df1$code) == as.character(df2$code), 'Y', df1$flag)

我正在对这些数据进行操作

year <- c(2011, 2012, 2011, 2013, 2014, 2016, 2016, 2015, 2016, 2010)
flag <- 'N'
code <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
df1 <- data.frame(year, flag, code)

rm(year)
rm(flag)
rm(code)

year <- c(2015, 2013, 2011, 2012, 2016, 2016, 2010)
code <- c(5, 7, 3, 2, 14, 99, 10)
df2 <- data.frame(year, code)

df1$flag <- ifelse(df1$year < 2013 &
df1$year == df2$year &
as.character(df1$code) == as.character(df2$code), 'Y', df1$flag)

我希望这是输出

> df1
year flag code
1 2011 1 1
2 2012 Y 2
3 2011 Y 3
4 2013 1 4
5 2014 1 5
6 2016 1 6
7 2016 1 7
8 2015 1 8
9 2016 1 9
10 2010 Y 10

但我却得到了这个

> df1
year flag code
1 2011 1 1
2 2012 1 2
3 2011 Y 3
4 2013 1 4
5 2014 1 5
6 2016 1 6
7 2016 1 7
8 2015 1 8
9 2016 1 9
10 2010 1 10

我希望 ifelse 语句将 df1$yeardf1$code 的每个元素与 df2$ 的每个元素进行比较yeardf2$code,但它看起来不像 ==%in% 会那样做。

换个说法,我要的就是这样比较元素

for(i in 1:nrow(df1)) {
for(z in 1:nrow(df2)) {
if(df1$year[i] < 2013 & df1$year[i] == df2$year[z] &
as.character(df1$code[i]) == as.character(df2$code[z]))
df1$flag[i] <- 'Y'
}
}

很明显像这样使用for会大大降低执行速度,无法使用,但看起来不像==%in%identical()all.equal() 将执行我在 for 循环中描述的操作。如何获得我在 R 中描述的输出?

最佳答案

ifelse 按元素比较两个向量(假设它们的长度相同,如果不相同,则小向量将被回收,以便它们相同)。

这意味着您的代码:

df1$flag <- ifelse(df1$year < 2013 &
df1$year == df2$year &
as.character(df1$code) == as.character(df2$code), 'Y', df1$flag)

相当于:

for(i in 1:nrow(df1)) {
if(df1$year[i] < 2013 & df1$year[i] == df2$year[i] &
as.character(df1$code[i]) == as.character(df2$code[i]))
df1$flag[i] <- 'Y'
}

假设 df1 和 df2 的行数相同。


更新

这是 merge 而不是 for loopif else 的情况。基本上,您想要合并年份和代码的数据集,然后如果年份小于 2013 年,则将 'Y' 分配给标志。

所以,我像这样向 df2 添加了一个标识符:

year <- c(2015, 2013, 2011, 2012, 2016, 2016, 2010)
code <- c(5, 7, 3, 2, 14, 99, 10)
flag2 <- 'Y'
#make sure the flags are not factors
df2 <- data.frame(year, code, flag2, stringsAsFactors = FALSE)

然后你就可以:

#merge on year and code
newdf <- merge(df1, df2, by = c('year', 'code'), all.x = TRUE)
#assign Y to flag if year < 2013 and flag2 == Y
newdf$flag[newdf$year < 2013 & newdf$flag2 == 'Y'] <- 'Y'
#delete flag2
newdf$flag2 <- NULL
newdf

出去

   year code flag
1 2010 10 Y
2 2011 1 N
3 2011 3 Y
4 2012 2 Y
5 2013 4 N
6 2014 5 N
7 2015 8 N
8 2016 6 N
9 2016 7 N
10 2016 9 N

关于r - %in%, == 或其他东西来比较多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44073794/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com