r - 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
什么是创建另一个逻辑列的最佳方法,该列表示 ifno
是nos
. 如何实现我想要做的事情或更好地完成我想要最终得到的事情?我欢迎任何解决方案base
,tidyverse
或data.table
。
编辑-1
我正在寻找消除for
循环。
解决方案
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 = "\\|"))
推荐阅读
- php - 为什么 eloquent orm 上的查询语句结果返回空值
- json - 捕获一个json格式日志的两个时间戳之间的所有日志
- python - Django,帖子下方的评论表单有问题
- docker - 在 docker 容器内运行 pulseaudio 以记录系统音频
- java - 如何在 Java 中发出 HTTP 请求并忽略正文
- jwt - Quarkus:如何在微服务之间进行身份验证?
- c - 指针丢失引用的问题
- jquery - 如何简化我冗长而冗余的 jquery 代码?
- excel - Excel 公式的最小值与 Tie Breaker 逻辑?
- r - build_vignettes() 随机失败