使用库(Tidyverse)。
我有一个非常大的数据帧,结构是这样的(数千个观测值按站点分为31个级别):
A tibble: 31 x 5
STATION NAME LONGITUDE LATITUDE ELEVATION
<fct> <list> <list> <list> <list>
1 US1ORLA0001 <chr [31]> <NULL> <NULL> <NULL>
2 US1ORLA0003 <chr [31]> <NULL> <NULL> <NULL>
3 US1ORLA0004 <chr [31]> <NULL> <NULL> <NULL>
4 US1ORLA0005 <chr [31]> <NULL> <NULL> <NULL>
5 US1ORLA0031 <chr [31]> <NULL> <NULL> <NULL>
6 US1ORLA0040 <chr [31]> <NULL> <NULL> <NULL>
7 US1ORLA0050 <chr [31]> <NULL> <NULL> <NULL>
8 US1ORLA0076 <chr [31]> <NULL> <NULL> <NULL>
9 US1ORLA0088 <chr [31]> <NULL> <NULL> <NULL>
10 US1ORLA0089 <chr [31]> <NULL> <NULL> <NULL>
... with 21 more rows我还有这个数据集的汇总版本,它是我用以下代码创建的:
summary <- raw %>%
group_by(STATION) %>%
summarise(count = n()) %>%
arrange(desc(count))结果是:
# A tibble: 31 x 2
STATION count
<fct> <int>
1 USC00353995 17136
2 USC00351324 14110
3 USR0000OHIG 11610
4 USR0000OVIL 11500
5 USR0000OGOO 10855
6 USC00352972 10068
7 USR0000ODUN 8286
8 USC00355204 5880
9 USR0000OCLY 4514
10 USC00352973 4295
# ... with 21 more rows我的目标是以left_join的方式将原始数据tibble连接到摘要数据tibble,这将导致每个级别(站点因子)有一个数据帧,一个COUNT列,以及来自原始数据的其余列(name,long,lat,ele)。如下所示:
# A tibble: 31 x 6
# Groups: STATION [31]
STATION count NAME LONGITUDE LATITUDE ELEVATION
<fct> <int> <fct> <dbl> <dbl> <dbl>
1 USC00353995 17136 HONEYMAN STATE PARK, OR US -124. 43.9 35.1
# ... with 30 more rows我已经尝试使用以下命令来完成此操作:
desired_output <- left_join(summary, raw, by = c("STATION" = "STATION"))我希望它保留x中的行(每个级别1行)和y中的列。问题是,它也保留了y形式的所有行,所以我以以下形式结束:
# A tibble: 135,905 x 6
# Groups: STATION [31]
STATION count NAME LONGITUDE LATITUDE ELEVATION
<fct> <int> <fct> <dbl> <dbl> <dbl>
1 USC00353995 17136 HONEYMAN STATE PARK, OR US -124. 43.9 35.1
2 USC00353995 17136 HONEYMAN STATE PARK, OR US -124. 43.9 35.1
3 USC00353995 17136 HONEYMAN STATE PARK, OR US -124. 43.9 35.1
4 USC00353995 17136 HONEYMAN STATE PARK, OR US -124. 43.9 35.1
5 USC00353995 17136 HONEYMAN STATE PARK, OR US -124. 43.9 35.1
6 USC00353995 17136 HONEYMAN STATE PARK, OR US -124. 43.9 35.1
7 USC00353995 17136 HONEYMAN STATE PARK, OR US -124. 43.9 35.1
8 USC00353995 17136 HONEYMAN STATE PARK, OR US -124. 43.9 35.1
9 USC00353995 17136 HONEYMAN STATE PARK, OR US -124. 43.9 35.1
10 USC00353995 17136 HONEYMAN STATE PARK, OR US -124. 43.9 35.1
# ... with 135,895 more rows这对我的目的没什么用。
实现这一目标和类似结果的最佳方法是什么?我愿意以完全不同的方式来做这件事(而不是使用汇总等)。
发布于 2018-08-12 10:10:51
我们在原始数据集上创建一个'count‘列,然后对这些列应用distinct,以便每个组只获得一个观察值
library(dplyr)
raw %>%
group_by(STATION) %>%
mutate(count = n()) %>%
ungroup %>%
distinct(STATION, .keep_all = TRUE)注意:在输入数据集中,一些列显示为list。根据显示的预期输出情况尚不清楚
发布于 2018-08-12 08:41:17
data.table方式:
library(data.table)
setDT(raw)
raw[ , .(count=.N, lat=unique(LATITUDE), lng=unique(LONGITUDE)), by=STATION]https://stackoverflow.com/questions/51804789
复制相似问题