簡體   English   中英

R:如何交叉數據幀列表和特定列

[英]R:How to intersect list of dataframes and specifc column

我試圖在data.frames列表中找到特定列中的所有匹配值。 但是,我一直得到character(0)的返回值。

我曾嘗試以下:簡單的子集(非常耗時) - >例如DAT [[I]] [[I]] lapply瓦特/縮小和相交(如圖這里

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

您可以先合並所有數據框,這樣您就只有一個:

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), ]

如果通過“交叉”表示使用特定列作為鍵進行“內部dplyr::inner_join ”或“合並”,那么 - 您希望使用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 -argument來跟蹤行的起源位置。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM