我只想获取一个包含两列的数据框,一个包含分组变量,第二个包含值,然后对其进行转换,以便分组变量成为具有适当值的列。一个非常简单的问题,但搜索了大约一个小时后,我找不到一个好的答案。这是一个玩具示例:

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/

10-12 23:30