R-根据其他列中的组元素数创建列

R-根据其他列中的组元素数创建列,r,dataframe,group-by,dplyr,data.table,R,Dataframe,Group By,Dplyr,Data.table,假设我有一个数据帧“raw”,如下所示(简化): raw使用dplyr的解决方案 library(dplyr) raw2 <- raw %>% group_by(id) %>% mutate(year.goal = min(year.start):max(year.end)) %>% ungroup() raw2 # # A tibble: 8 x 4 # year.start year.end id year.goal # <

假设我有一个数据帧“raw”,如下所示(简化):


raw使用
dplyr
的解决方案

library(dplyr)

raw2 <- raw %>%
  group_by(id) %>%
  mutate(year.goal = min(year.start):max(year.end)) %>%
  ungroup()
raw2
# # A tibble: 8 x 4
#   year.start year.end id    year.goal
#        <dbl>    <dbl> <fct>     <int>
# 1       2004     2006 A          2004
# 2       2004     2006 A          2005
# 3       2004     2006 A          2006
# 4       2004     2005 B          2004
# 5       2004     2005 B          2005
# 6       2010     2012 C          2010
# 7       2010     2012 C          2011
# 8       2010     2012 C          2012
一个使用基R的解决方案

dat_list <- split(raw, f = raw$id)
dat_list2 <- lapply(dat_list, function(x) {
  x$year.goal <- x$year.start[1]:x$year.end[1]
  return(x)
})
raw2 <- do.call(rbind, dat_list2)
raw2
#     year.start year.end id year.goal
# A.1       2004     2006  A      2004
# A.2       2004     2006  A      2005
# A.3       2004     2006  A      2006
# B.4       2004     2005  B      2004
# B.5       2004     2005  B      2005
# C.6       2010     2012  C      2010
# C.7       2010     2012  C      2011
# C.8       2010     2012  C      2012
另一个
dplyr
解决方案

library(dplyr)
raw2 <- raw %>%
  group_by(id) %>%
  mutate(year.goal = first(year.start) + row_number() - 1) %>%
  ungroup()
raw2
# # A tibble: 8 x 4
#   year.start year.end id    year.goal
#        <dbl>    <dbl> <fct>     <dbl>
# 1       2004     2006 A          2004
# 2       2004     2006 A          2005
# 3       2004     2006 A          2006
# 4       2004     2005 B          2004
# 5       2004     2005 B          2005
# 6       2010     2012 C          2010
# 7       2010     2012 C          2011
# 8       2010     2012 C          2012
库(dplyr)
raw2%
分组依据(id)%>%
突变(year.goal=first(year.start)+行号()-1)%>%
解组()
raw2
##A tibble:8 x 4
#年份.开始年份.结束id年份.目标
#                  
#1 2004 2006 A 2004
#2 2004 2006 A 2005
#3 2004 2006 A 2006
#4 2004 2005 B 2004
#5 2004年2005年B 2005年
#2010年6月2012年C 2010年
#2010年7月2012年C 2011年
#8 2010 2012 C 2012

哇,非常感谢!!!显然有很多不同的方法来处理这个问题:)只有一个后续问题:在我的原始数据中,我收到以下错误:“错误:列<代码>年。目标长度必须为6(组大小)或1,而不是5”。你知道错误可能来自哪里吗?好的,只有第一个解决方案,另一个dplyr解决方案工作得非常好@尼古拉斯不知道发生了什么事。如果第一个解决方案适用于示例数据集,但不适用于真实数据集,则意味着示例数据集与真实数据集之间存在一些关键差异。
library(data.table)
setDT(raw)

raw2 <- raw[, year.goal :=  min(year.start):max(year.end), by = id]
raw2[]
#    year.start year.end id year.goal
# 1:       2004     2006  A      2004
# 2:       2004     2006  A      2005
# 3:       2004     2006  A      2006
# 4:       2004     2005  B      2004
# 5:       2004     2005  B      2005
# 6:       2010     2012  C      2010
# 7:       2010     2012  C      2011
# 8:       2010     2012  C      2012
dat_list <- split(raw, f = raw$id)
dat_list2 <- lapply(dat_list, function(x) {
  x$year.goal <- x$year.start[1]:x$year.end[1]
  return(x)
})
raw2 <- do.call(rbind, dat_list2)
raw2
#     year.start year.end id year.goal
# A.1       2004     2006  A      2004
# A.2       2004     2006  A      2005
# A.3       2004     2006  A      2006
# B.4       2004     2005  B      2004
# B.5       2004     2005  B      2005
# C.6       2010     2012  C      2010
# C.7       2010     2012  C      2011
# C.8       2010     2012  C      2012
library(tidyverse)

raw2 <- raw %>%
  group_by_all() %>%
  nest() %>%
  mutate(year.goal = map2(year.start, year.end, `:`)) %>%
  unnest()
raw2
# # A tibble: 8 x 4
#   year.start year.end id    year.goal
#        <dbl>    <dbl> <fct>     <int>
# 1       2004     2006 A          2004
# 2       2004     2006 A          2005
# 3       2004     2006 A          2006
# 4       2004     2005 B          2004
# 5       2004     2005 B          2005
# 6       2010     2012 C          2010
# 7       2010     2012 C          2011
# 8       2010     2012 C          2012
library(dplyr)
raw2 <- raw %>%
  group_by(id) %>%
  mutate(year.goal = first(year.start) + row_number() - 1) %>%
  ungroup()
raw2
# # A tibble: 8 x 4
#   year.start year.end id    year.goal
#        <dbl>    <dbl> <fct>     <dbl>
# 1       2004     2006 A          2004
# 2       2004     2006 A          2005
# 3       2004     2006 A          2006
# 4       2004     2005 B          2004
# 5       2004     2005 B          2005
# 6       2010     2012 C          2010
# 7       2010     2012 C          2011
# 8       2010     2012 C          2012