R-根据其他列中的组元素数创建列
假设我有一个数据帧“raw”,如下所示(简化):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使用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