使用多组列变量重塑数据

时间:2014-12-16 22:10:17

标签: r reshape

我正在尝试重塑我的一些数据,并且没有运气reshape2包。根据我的数据,我没有尝试过任何我正在寻找的东西。

我有一个看起来像这样的data.frame(其中name1对应age1,name2对应age2等):

city <- c("New York", "Philadelphia", "Chicago")
state <- c("NY", "PA", "IL")
name1 <- c("Tim", NA, NA)
name2 <- c("Bob", "Jim", "Bill")
name3 <- c(NA, NA, "Jeff")
age1 <- c(40, NA, NA)
age2 <- c(30, 29, 34)
age3 <- c(NA, NA, 27)

df <- data.frame(city, state, name1, name2, name3, age1, age2, age3)

          city state name1 name2 name3 age1 age2 age3
1     New York    NY   Tim   Bob  <NA>   40   30   NA
2 Philadelphia    PA  <NA>   Jim  <NA>   NA   29   NA
3      Chicago    IL  <NA>  Bill  Jeff   NA   34   27

在我的实际数据集中,我有大约50&#34; name&#34;和&#34;年龄&#34;每个变量。

最终,我的目标是4个变量:城市,州,名称,年龄。我也不想在我完成的数据集中使用NA。所以我想要实现的目标是:

          city state name age
1     New York    NY  Tim  40
2     New York    NY  Bob  30
3 Philadelphia    PA  Jim  29
4      Chicago    IL Bill  34
5      Chicago    IL Jeff  27

任何帮助将不胜感激!我已经尝试过reshape2和tidyR包,但还没有运气!

谢谢!

2 个答案:

答案 0 :(得分:3)

melt来自&#34; reshape2&#34;目前无法很好地处理这个问题,因为&#34; name&#34;和&#34;年龄&#34;列有不同的类型。但是,更新版本的&#34; data.table&#34; (它也将实现融化)将允许您通过提供list度量变量来进行此类转换。 (参见Issue #828,其功能在V1.9.8中启动&#34; data.table&#34;。)

与此同时,除了基础R中的reshape,您还可以尝试{&#34; splitstackshape&#34}中的merged.stack。包:

library(splitstackshape)
na.omit(merged.stack(df, var.stubs = c("name", "age"), sep = "var.stubs"))
#            city state .id .t1 name age
# 1:      Chicago    IL   2   2 Bill  34
# 2:      Chicago    IL   3   3 Jeff  27
# 3:     New York    NY   1   1  Tim  40
# 4:     New York    NY   2   2  Bob  30
# 5: Philadelphia    PA   2   2  Jim  29

sep = "var.stubs"是一种说法,在变量存根和&#34;时间&#34;之间没有分隔符。测量。

如果您还想删除不必要的列,可以将其复合到上一个语句中(或者使用subset作为@MrFlick)。

na.omit(
  merged.stack(df, var.stubs = c("name", "age"), 
               sep = "var.stubs")[, c(
                 "city", "state", "name", "age"), with = FALSE])
#            city state name age
# 1:      Chicago    IL Bill  34
# 2:      Chicago    IL Jeff  27
# 3:     New York    NY  Tim  40
# 4:     New York    NY  Bob  30
# 5: Philadelphia    PA  Jim  29

答案 1 :(得分:2)

只需使用基本R功能,即可

subset(reshape(df, list(paste0("name", 1:3), paste0("age", 1:3)), 
    v.names=c("name","age"),
    direction="long"), !is.na(name), select=-c(time, id))

获取

            city state name age
1.1     New York    NY  Tim  40
1.2     New York    NY  Bob  30
2.2 Philadelphia    PA  Jim  29
3.2      Chicago    IL Bill  34
3.3      Chicago    IL Jeff  27