首页 > 解决方案 > R:将列与作为列表对象存在的另一列中的值进行比较

问题描述

DF1使用 for 循环创建或从某人那里得到它。我想检查DF2相应日期的是否有值(作为列表或在字符串中连接)。我经常遇到这种情况。这是代码。

library(dplyr)
library(magrittr)
DF1 <- data.frame(det = as.Date(c('2013-02-02','2018-01-11','2011-07-10')),nos = c("1|3","4|2|1","3|4")) %>% print
DF2 <- data.frame(det1 = as.Date(c('2013-02-02','2018-01-11')),no = c(1,3)) %>% print
DF1 = left_join(DF2,DF1,by=c('det1'='det')) %>%
  mutate(list_column = strsplit(nos,split = "\\|")) %>% 
  print
# DF1
# det1 no   nos
# 1 2013-02-02  1   1|3
# 2 2018-01-11  2 4|2|1
for(i_ in 1:nrow(DF1)){
  # i_ = 1
  temp = DF1[i_,]
  list_vals = temp$list_column %>% as.vector() %>% unlist() %>% as.numeric() %>% print
  DF1$present[i_] = temp$no %in% list_vals
    }
#R>DF1
#        det1 no   nos list_column present
#1 2013-02-02  1   1|3        1, 3    TRUE
#2 2018-01-11  3 4|2|1     4, 2, 1   FALSE

什么是创建另一个逻辑列的最佳方法,该列表示 ifnonos. 如何实现我想要做的事情或更好地完成我想要最终得到的事情?我欢迎任何解决方案basetidyversedata.table

编辑-1

我正在寻找消除for循环。

标签: rdata.tabletidyverse

解决方案


library(data.table)
setDT(DF1)
DF1[, present := as.character(no) %in% list_column[[1]], by = seq_len(nrow(DF1))][]

         det1 no   nos list_column present
1: 2013-02-02  1   1|3         1,3    TRUE
2: 2018-01-11  3 4|2|1       4,2,1   FALSE

数据(只需在一个地方添加 as.character() )

DF1 <- data.frame(det = as.Date(c('2013-02-02','2018-01-11','2011-07-10')),nos = c("1|3","4|2|1","3|4")) %>% print
DF2 <- data.frame(det1 = as.Date(c('2013-02-02','2018-01-11')),no = c(1,3)) %>% print
DF1 = left_join(DF2,DF1,by=c('det1'='det')) %>%
  mutate(list_column = strsplit(as.character(nos),split = "\\|"))

推荐阅读