【问题标题】:R:How to intersect list of dataframes and specifc columnR:如何相交数据框列表和特定列
【发布时间】:2019-07-31 10:28:28
【问题描述】:

我正在尝试在 data.frames 列表中的特定列中查找所有匹配值。但是,我不断收到 character(0) 的返回值。

我尝试了以下方法: 简单子集(非常耗时)-> 例如数据[[i]][[i]] lapply w/ Reduce 和 intersect (见here

LocA<-data.frame(obs.date=c("2018-01-10","2018-01-14","2018-01-20),
obs.count=c(2,0,1))
LocB<-data.frame(obs.date=c("2018-01-09","2018-01-14","2018-01-20),
obs.count=c(0,3,5))
LocC<-data.frame(obs.date=c("2018-01-12","2018-01-14","2018-01-19"),
obs.count=c(2,0,1))
LocD<-data.frame(obs.date=c("2018-01-11","2018-01-16","2018-01-21"),
obs.count=c(2,0,1))

dfList<-list(LocA,LocB,LocC,LocD)

##List of all dates 

lapply(dfList,'[[',1)
[1]"2018-01-10" "2018-01-14" "2018-01-20" "2018-01-09"...

尝试(失败)

>Reduce(intersect,lapply(dfList,'[[',1))
character (0)

我希望此函数的输出是标识共享共同日期的 data.frames 的输出。

*如果有人知道如何识别共享日期并变异为单个数据框,其中..Col1 = 数据框名称,Col2=obs.date,Col3 = obs.count,您会更加微笑

【问题讨论】:

    标签: r list dataframe


    【解决方案1】:

    你可以先合并所有的数据框,这样你就只有一个了:

    a <- Reduce(function(x, y) merge(x, y, all = TRUE), dfList)
    

    或者你可以像这样合并它们:

    a <-rbind(LocA,LocB,LocC,LocD)
    

    之后,您可以提取所有重复项:

    b <- a[duplicated(a$obs.date), ]
    

    或者,如果您想保留所有唯一的并保留重复项:

    c <- a[!duplicated(a$obs.date), ]
    

    【讨论】:

    • 谢谢!这正是我一直在寻找的。知道我是否可以格式化返回的数据框以列出相同的信息,但每列在哪里?喜欢...日期 |地点 |位置 B | LocC ... 01-01-2018 2 0 1 我想对计数运行泊松以查看关系(如果有)
    • 很高兴听到我能帮上忙!不,遗憾的是我不知道一个方便的解决方案。但是您可以尝试添加一个名为 Location 的变量,例如 Location = c("D", "D", "D")。然后你可以看到位置。然后肯定有一种方法可以将其格式化为您想要的数据框:)
    • LocA&lt;-data.frame(obs.date=c("2018-01-10","2018-01-14","2018-01-20"), obs.count=c(2,0,1), Location = c("A", "A", "A")) LocB&lt;-data.frame(obs.date=c("2018-01-09","2018-01-14","2018-01-20"), obs.count=c(0,3,5), Location = c("B", "B", "B")) LocC&lt;-data.frame(obs.date=c("2018-01-12","2018-01-14","2018-01-19"), obs.count=c(2,0,1), Location = c("C", "C", "C")) LocD&lt;-data.frame(obs.date=c("2018-01-11","2018-01-16","2018-01-21"), obs.count=c(2,0,1), Location = c("D", "D", "D"))
    【解决方案2】:

    如果“相交”是指以特定列作为键进行“内连接”或“合并”,那么您想使用dplyr::inner_joinmerge

    首先,在两个data.frames之间:

    library(dplyr)
    inner_join(LocA, LocB, by='obs.date')
    # 2 rows
    inner_join(LocC, LocD, by='obs.date')
    # zero rows
    

    所以,不是无限合并。

    堆叠,然后计数

    我们将首先合并数据,然后计算出现次数。请注意使用.id-参数来跟踪行的来源。

    library(dplyr)
    bind_rows(dfList, .id = 'id') %>%
      add_count(obs.date) %>% 
      filter(n > 1)
    # A tibble: 5 x 4
      id    obs.date   obs.count     n
      <chr> <chr>          <dbl> <int>
    1 1     2018-01-14         0     3
    2 1     2018-01-20         1     2
    3 2     2018-01-14         3     3
    4 2     2018-01-20         5     2
    5 3     2018-01-14         0     3
    

    【讨论】:

      猜你喜欢
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      相关资源
      最近更新 更多