我只想获取一个包含两列的数据框,一个包含分组变量,第二个包含值,然后对其进行转换,以便分组变量成为具有适当值的列。一个非常简单的问题,但搜索了大约一个小时后,我找不到一个好的答案。这是一个玩具示例:
var <- c("Var1", "Var1", "Var2", "Var2")
value <- c(1, 2, 3, 4)
df <- data.frame(var, value)
df.one <- df[df$var == "Var1", ]
df.two <- df[df$var == "Var2", ]
desired.df <- data.frame(df.one[2], df.two[2])
colnames(desired.df) <- c("Var1", "Var2")
desired.df
有了更多的变量和值,这段代码可能会变得非常笨重。任何人都可以提出更好的方法吗?任何建议将不胜感激!
最佳答案
数据:
df <- structure(list(var = structure(c(1L, 1L, 2L, 2L),
.Label = c("Var1", "Var2"), class = "factor"),
value = c(1, 2, 3, 4)), .Names = c("var", "value"),
class = "data.frame", row.names = c(NA, -4L))
看起来在
var
中引入一个识别观察的新变量很有用(我在下面称之为 case
);如果您愿意,可以在重塑后将其删除。使用
reshape2
/plyr
:library("plyr")
library("reshape2")
## add 'case' identifier
df <- ddply(df,"var",mutate,case=1:length(var))
## dcast() to reshape; then drop identifier
dcast(df,case~var)[,-1]
使用
tidyr
(相同的策略):library("tidyr")
library("dplyr")
df %>% group_by(var) %>%
mutate(case=seq(n())) %>%
spread(var,value) %>%
select(-case)
这可能也可以使用基础 R 中的
reshape()
来完成,但我一直无法弄清楚......关于r - 如何在 R 中进行简单的转置/旋转,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28463864/