【问题标题】:R lookup between 2 data framesR在2个数据帧之间查找
【发布时间】:2014-09-07 09:36:01
【问题描述】:

假设我有两个数据框

df1=data.frame(item=c(rep("a",2),rep("b",3),"c","NA",rep("d",4)),
product=paste0("prd",seq(1:11)))
df2=data.frame(item=c("b","d"), price=c(10,20))

对于 df1,我需要添加一个 col 来指示它是否在 df2 item col 中,以及对于每一行,指示那里有多少产品,除非它是 na,像这样

item product#
a    2
a    2
b    3
b    3
b    3

我应该如何获得每行的产品计数重复?

我正在使用的查找

df1$hasDF2=ifelse(is.na(match(df1$item,df2$item)),"N","Y")

有没有更有效的选择?

谢谢!

【问题讨论】:

    标签: r dataframe lookup


    【解决方案1】:

    试试:

     df1$productNo<- with(df1, ave(seq_along(product), item, FUN=length))
      df1$productNo
      #[1] 2 2 3 3 3 1 1 4 4 4 4
    
     df1$hasDF2 <- c("N", "Y")[(!is.na(match(df1$item, df2$item))) +1]
     df1$hasDF2
     #[1] "N" "N" "Y" "Y" "Y" "N" "N" "Y" "Y" "Y" "Y"
    

    或使用data.table

     library(data.table)
     setDT(df1)[,c("produtNo", "hasDF2") := list(.N, "N"), 
                  by=item][item %in% df2$item, hasDF2:= "Y"]
    

    更新

    对于unique 计数,您可以这样做:

     #creating a dataset with duplicate products
     df1 <- data.frame(item=c(rep("a",2),rep("b",3),"c","NA",rep("d",5)),
     product=paste0("prd",c(1:11,11)))
    
     setDT(df1)[,c("productNo", "hasDF2") := list(length(unique(product)), "N"), 
              by=item][item %in% df2$item, hasDF2:= "Y"]   
    

    【讨论】:

    • 如果需要唯一计数而不是计数,我应该如何修改 FUN=length?谢谢
    • @santoku 你想总结计数而不是每行都有计数吗?
    • 我想计算每一行的数量,但成像产品的每一项都有重复项。无论如何 FUN=length 就足够了
    猜你喜欢
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多