首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dplyr基于某些条件创建新列

dplyr基于某些条件创建新列
EN

Stack Overflow用户
提问于 2021-07-31 04:33:58
回答 1查看 180关注 0票数 2

我有以下df:

代码语言:javascript
复制
df<-data.frame(geo_num=c(11,12,22,41,42,43,77,71),
               cust_id=c("A","A","B","C","C","C","D","D"),
               sales=c(2,3,2,1,2,4,6,3))
> df
  geo_num cust_id sales
1      11       A     2
2      12       A     3
3      22       B     2
4      41       C     1
5      42       C     2
6      43       C     4
7      77       D     6
8      71       D     3

需要创建一个新列“geo_num_new”,该列对“cust_id”中的每个组都有来自“geo_num”的第一个值,如下所示:

代码语言:javascript
复制
> df_new
  geo_num cust_id sales geo_num_new
1      11       A     2          11
2      12       A     3          11
3      22       B     2          22
4      41       C     1          41
5      42       C     2          41
6      43       C     4          41
7      77       D     6          77
8      71       D     3          77

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-31 04:34:42

我们可以在按“cust_id”进行分组后使用first。单个值将用于整个分组。

代码语言:javascript
复制
library(dplyr)
df <- df %>% 
    group_by(cust_id) %>%
    mutate(geo_num_new = first(geo_num)) %>%
    ungroup

-ouptut

代码语言:javascript
复制
df
# A tibble: 8 x 4
  geo_num cust_id sales geo_num_new
    <dbl> <chr>   <dbl>       <dbl>
1      11 A           2          11
2      12 A           3          11
3      22 B           2          22
4      41 C           1          41
5      42 C           2          41
6      43 C           4          41
7      77 D           6          77
8      71 D           3          77

或者使用data.table

代码语言:javascript
复制
library(data.table)
setDT(df)[, geo_num_new := first(geo_num), by = cust_id]

或使用base R

代码语言:javascript
复制
df$geo_num_new <- with(df, ave(geo_num, cust_id, FUN = function(x) x[1]))

或使用collapse选项

代码语言:javascript
复制
library(collapse)
tfm(df, geo_num_new = ffirst(geo_num, g = cust_id, TRA = "replace"))
  geo_num cust_id sales geo_num_new
1      11       A     2          11
2      12       A     3          11
3      22       B     2          22
4      41       C     1          41
5      42       C     2          41
6      43       C     4          41
7      77       D     6          77
8      71       D     3          77
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68599120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档