每个ID为单行,每个ID为多个行 [英] Single row per id to multiple row per id
本文介绍了每个ID为单行,每个ID为多个行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想根据给定的时间间隔将单次排列每个ID的观察次数扩展到多个行数:
I'd like to expand observations from single row-per-id to multiple rows-per-id based on a given time interval:
> dput(df)
structure(list(id = c(123, 456, 789), gender = c(0, 1, 1), yr.start = c(2005,
2010, 2000), yr.last = c(2007, 2012, 2000)), .Names = c("id",
"gender", "yr.start", "yr.last"), class = c("tbl_df", "tbl",
"data.frame"), row.names = c(NA, -3L))
> df
# A tibble: 3 x 4
id gender yr.start yr.last
<dbl> <dbl> <dbl> <dbl>
1 123 0 2005 2007
2 456 1 2010 2012
3 789 1 2000 2000
我希望每年将ID扩展成一行:
I want to get id expanded into one row per year:
> dput(df_out)
structure(list(id = c(123, 123, 123, 456, 456, 456, 789), gender = c(0,
0, 0, 1, 1, 1, 1), yr = c(2005, 2006, 2007, 2010, 2011, 2012,
2000)), .Names = c("id", "gender", "yr"), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -7L))
> df_out
# A tibble: 7 x 3
id gender yr
<dbl> <dbl> <dbl>
1 123 0 2005
2 123 0 2006
3 123 0 2007
4 456 1 2010
5 456 1 2011
6 456 1 2012
7 789 1 2000
我知道如何融化/重塑,但我不知道如何我可以扩大这几年。
谢谢。
I know how to melt/reshape, but I'm not sure how I can expand the years. Thanks.
推荐答案
这是一个基本的R方法。
Here is a base R method.
# expand years to a list
yearList <- mapply(":", df$yr.start, df$yr.last)
现在,使用此列表计算每个ID重复的行数(第二个参数 rep
),然后将其作为向量(从具有 unlist
的列表转换)使用 cbind
。
Now, use this list to calculate the number of rows to repeat for each ID (the second argument of rep
) and then append it as a vector (transformed from list with unlist
) using cbind
.
# get data.frame
cbind(df[rep(seq_along(df$id), lengths(yearList)), c("id", "gender")], yr=unlist(yearList))
id gender yr
1 123 0 2005
1.1 123 0 2006
1.2 123 0 2007
2 456 1 2010
2.1 456 1 2011
2.2 456 1 2012
3 789 1 2000
这篇关于每个ID为单行,每个ID为多个行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文