我尝试比较两个不同数据框中的3列,并根据比较结果更新"标志"。
例如,
df_1 <- data.frame(x=seq(1,5,1),y=seq(1.5,5.5,1),z=LETTERS[1:5],Flag=0)
df_2 <- data.frame(l=c(1.2,10,3.2,5,5.2),k=c("A","F","P","D","E"))
如果df_2(col = l)的行式元素介于df_1(col = x,y)的行式元素之间,并且df_1(col = z)中的行式元素与df_2(col = k)的行式元素匹配,则flag更新为1,否则为0。因此,预期输出为
我的代码到目前为止:
df_1 %>% mutate(Flag=map_chr(
.x=c(as.character(df_1$z),as.numeric(df_1$x),as.numeric(df_1$y)),
.f= ~if_else(condition = all(.x == as.character(df_2$k) & x >= as.numeric(df_2$l)& x<=as.numeric(df_2$k)),true="1",false="0")
))
错误:mutate()
中的错误:!计算Flag = map_chr(...)
时出现问题。Flag
的大小必须为5或1,而不是15。运行rlang::last_error()
以查看错误发生的位置。有15个警告(使用warnings()查看它们)
warnings()
警告信息:1:计算Flag = map_chr(...)
时出现问题。强制引入的NA 2:计算Flag = map_chr(...)
时出现问题。强制3引入的NA:计算Flag = map_chr(...)
时出现问题。强制引入的NAs ... 15次由于 Dataframe 相当大,我试图避免循环。
非常感谢@zephryl回答了我最初的问题(见上图)
这个问题的一个变体是:df_1中的一行将与df_2中的所有行进行比较,并且标志相应地"递增"。
例如,df_1
df_2
预期产出
先谢了!
由于 Dataframe 很大,我正在尝试避免循环
我已经用循环解决了
for(i in seq(1,nrow(df_1_new),1))
{for(j in seq(1,nrow(df_2),1))
{if(df_1_new$z[i] == df_2$k[j] & df_1_new$x[i] <= df_2$l[j] &
df_1_new$y[i] >= df_2$l[j])
{df_1_new$Flag[i] = df_1_new$Flag[i]+1}}}
有没有更好的办法?
1条答案
按热度按时间bkhjykvo1#
对于第一个问题,不需要使用
map()
或循环,您可以直接测试条件,这要归功于矢量化操作:或者,
或者,
所有3种方法的结果:
对于第二个问题,可以使用
purrr::pmap_dbl()
在df_1
中迭代x
、y
和z
(注意,我将df_2
的第二个版本重命名为df_2_2
,因为它具有不同的值)。