R: 如何避免合并两个数据框(group by/summarise)时出现错误?
R: How do I avoid getting an error when merging two data frames (group by/summarise)?
我有 80,000 行的大 data frame
。它是由来自不同年份的个人 data frames
组合而成。 origin
变量表示条目原始 data frame
.
的年份
这里是 data frame
大行中前几行的示例,显示了 2003 年和 2011 年的数据帧是如何组合的。
df_1:
ID City State origin
1 NY NY 2003
2 NY NY 2003
3 SF CA 2003
1 NY NY 2011
3 SF CA 2011
2 NY NY 2011
4 LA CA 2011
5 SD CA 2011
现在我想创建一个名为 first_appearance
的新变量,它为每个 ID
:
获取 origin
变量的 min
final_df:
ID City State origin first_appearance
1 NY NY 2003 2003
2 NY NY 2003 2003
3 SF CA 2003 2003
1 NY NY 2011 2003
3 SF CA 2011 2003
2 NY NY 2011 2003
4 LA CA 2011 2011
5 SD CA 2011 2011
到目前为止,我已经尝试使用:
prestep_final <- df_1 %>% group_by(ID) %>% summarise(first_apperance = min(origin))
final_df <- merge(prestep_final, df_1, by = "ID")
Prestep_final
工作并产生 data frame
与 ID
和 first_appearance
.
不幸的是,merge
步骤不起作用,生成的 data frame
仅包含 NA 条目。
我怎样才能改进我的代码,以便我可以生成像上面的 final_df
这样的 table。如果有任何建议,我将不胜感激,但我没有套餐偏好。
如果将 summarise
更改为 mutate
,则无需合并即可获得所需的结果:
library(tidyverse)
df <- tibble::tribble(
~ID, ~City, ~State, ~origin,
1, 'NY', 'NY', 2003,
2, 'NY', 'NY', 2003,
3, 'SF', 'CA', 2003,
1, 'NY', 'NY', 2011,
3, 'SF', 'CA', 2011,
2, 'NY', 'NY', 2011,
4, 'LA', 'CA', 2011,
5, 'SD', 'CA', 2011
)
df %>% group_by(ID) %>%
mutate(first_appearance = min(origin))
#> # A tibble: 8 x 5
#> # Groups: ID [5]
#> ID City State origin first_appearance
#> <dbl> <chr> <chr> <dbl> <dbl>
#> 1 1 NY NY 2003 2003
#> 2 2 NY NY 2003 2003
#> 3 3 SF CA 2003 2003
#> 4 1 NY NY 2011 2003
#> 5 3 SF CA 2011 2003
#> 6 2 NY NY 2011 2003
#> 7 4 LA CA 2011 2011
#> 8 5 SD CA 2011 2011
由 reprex package (v0.3.0)
于 2020 年 6 月 10 日创建
选项data.table
library(data.table)
setDT(df)[, first_appearance := min(origin), ID]
或在base R
df$first_appearance <- with(df, ave(origin, ID, FUN = min))
我有 80,000 行的大 data frame
。它是由来自不同年份的个人 data frames
组合而成。 origin
变量表示条目原始 data frame
.
这里是 data frame
大行中前几行的示例,显示了 2003 年和 2011 年的数据帧是如何组合的。
df_1:
ID City State origin
1 NY NY 2003
2 NY NY 2003
3 SF CA 2003
1 NY NY 2011
3 SF CA 2011
2 NY NY 2011
4 LA CA 2011
5 SD CA 2011
现在我想创建一个名为 first_appearance
的新变量,它为每个 ID
:
origin
变量的 min
final_df:
ID City State origin first_appearance
1 NY NY 2003 2003
2 NY NY 2003 2003
3 SF CA 2003 2003
1 NY NY 2011 2003
3 SF CA 2011 2003
2 NY NY 2011 2003
4 LA CA 2011 2011
5 SD CA 2011 2011
到目前为止,我已经尝试使用:
prestep_final <- df_1 %>% group_by(ID) %>% summarise(first_apperance = min(origin))
final_df <- merge(prestep_final, df_1, by = "ID")
Prestep_final
工作并产生 data frame
与 ID
和 first_appearance
.
不幸的是,merge
步骤不起作用,生成的 data frame
仅包含 NA 条目。
我怎样才能改进我的代码,以便我可以生成像上面的 final_df
这样的 table。如果有任何建议,我将不胜感激,但我没有套餐偏好。
如果将 summarise
更改为 mutate
,则无需合并即可获得所需的结果:
library(tidyverse)
df <- tibble::tribble(
~ID, ~City, ~State, ~origin,
1, 'NY', 'NY', 2003,
2, 'NY', 'NY', 2003,
3, 'SF', 'CA', 2003,
1, 'NY', 'NY', 2011,
3, 'SF', 'CA', 2011,
2, 'NY', 'NY', 2011,
4, 'LA', 'CA', 2011,
5, 'SD', 'CA', 2011
)
df %>% group_by(ID) %>%
mutate(first_appearance = min(origin))
#> # A tibble: 8 x 5
#> # Groups: ID [5]
#> ID City State origin first_appearance
#> <dbl> <chr> <chr> <dbl> <dbl>
#> 1 1 NY NY 2003 2003
#> 2 2 NY NY 2003 2003
#> 3 3 SF CA 2003 2003
#> 4 1 NY NY 2011 2003
#> 5 3 SF CA 2011 2003
#> 6 2 NY NY 2011 2003
#> 7 4 LA CA 2011 2011
#> 8 5 SD CA 2011 2011
由 reprex package (v0.3.0)
于 2020 年 6 月 10 日创建选项data.table
library(data.table)
setDT(df)[, first_appearance := min(origin), ID]
或在base R
df$first_appearance <- with(df, ave(origin, ID, FUN = min))