【问题标题】:How to know if the value if a column is part of another column's value in R data.table如果一列是R data.table中另一列值的一部分,如何知道该值是否
【发布时间】:2016-07-13 06:24:15
【问题描述】:

我有一个 data.table ,其中我的客户很少,有一些 day value 和 pay_day value 。 pay_day 是每个客户的长度为 5 的向量,它由日期值组成

我想用 pay_day 向量检查每一天的值是否是 pay_day 的一部分

这是一个虚拟数据(请原谅创建数据的混乱方式)无法想到更好的方法 atm

customers <- c("179288" ,"146506" ,"202287","16207","152979","14421","41395","199103","183467","151902")
mdays <- 1:31
set.seed(1)
data <- sort(rep(customers,100))
days <- sample(mdays,1000,replace=T)

xyz <- cbind(data,days)
x <- vector(length=1000L)
j <- 1
for( i in 1:10){

  set.seed(i) ## I wanted diff dates to be picked 
  m <- sample(mdays,5)


  while(j <=100*i){
  x[j] <- paste(m,collapse = ",")
  j <- j+1
  }
}

xyz <- cbind(xyz,x)
require(data.table)
my_data <-  setDT(as.data.frame(xyz))

setnames(my_data, c("cust","days","pay_days"))
my_data[,pay:=runif(1000,min = 0,max=10000)]

现在我想为每个cust 提供pays 的向量,它发生在pay_days

我尝试了各种方法,但似乎无法弄清楚,我最初的想法是创建一个标志,如果 days 是 pay_days 的子集,然后根据标志收取工资 my_data[,ifelse(grepl(days,pay_days),1,0),cust]

这不像我期望的那样工作。我不想使用原生循环作为

实际数据非常庞大。

【问题讨论】:

  • Error in x[j] &lt;- paste(m, collapse = ",") : object 'x' not found
  • 哎呀我忘了添加x

标签: r data.table


【解决方案1】:

使用 tidyr 将 pay_days 列拆分为然后检查 days 是否在 pay_days 中:

library(tidyr)
library(dplyr)

# creating long-form data
tidier <- my_data %>% 
  mutate(pay_days = strsplit(as.character(pay_days), ",")) %>%
  unnest(pay_days)

# casting as numeric to make factor & character columns comparable
tidier[, days := as.numeric(days)]
tidier[, pay_days := as.numeric(pay_days)]

tidier[days == pay_days, pay, by=cust]

不确定这对大数据的执行情况如何,因为您将表长度乘以 pay_days 中的天数...

旁注:我还不能发表评论,但要复制您的数据,需要添加 library(data.table) 并初始化 x x&lt;-vector(),否则无法找到,正如 Dee 还指出的那样。

【讨论】:

    【解决方案2】:

    另一种使用数据表的单线方法:

    my_data[,result:=sum(unlist(lapply(strsplit(as.character(pay_days),","),match,days)),na.rm=T)>0,by=1:nrow(my_data)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-07
      • 1970-01-01
      • 2018-01-15
      • 2023-01-14
      • 2019-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多