我正在尝试重塑我的一些数据,并且没有运气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包,但还没有运气!
谢谢!
答案 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