我在数据框中有两列,一列是“直径”,另一列是“灰”。我试图根据ash列中的标签将两列转置为几列。这应该很简单,但是自从我使用R以来已经很长时间了。
X Diameter Ash
1 0.566176 Apache
2 0.588312 Apache
3 0.590499 Tolk
4 0.607365 Belle Isle
5 0.631185 Tolk
我希望它看起来像:
X Apache Belle Isle Tolk
1 0.566 0.607 0.590
2 0.588 N/A 0.631
答案 0 :(得分:1)
我的解决方案按Ash分组数据,使用row_number()创建一个新变量,然后传播数据。
library(tidyverse)
x <- tibble(X= c(1:5),
Diameter = c(0.56,0.58,0.59,0.60,0.63),
Ash = c("Apache", "Apache", "Tolk", "Belle Isle","Tolk"))
df_2 <- x %>%select(-X) %>%
arrange(Ash) %>%
group_by(Ash) %>%
mutate(row = row_number()) %>%
spread(Ash, Diameter)
df_2
答案 1 :(得分:1)
我们可以使用spread
函数。
data2 <- data %>%
spread(key=Ash, value=Diameter)
但是,这会生成5行数据;因此,我们使用下面的函数(from this SO answer here)将所有值上移并下移NA
,并过滤掉所有NA
的所有行,因此在这种情况下最终只有两行。
move_vals_up <- function(x) {
num.na <- sum(is.na(x))
x <- x[!is.na(x)]
x <- c(x, rep(NA, num.na))
return(x)
}
as.data.frame(lapply(data2, move_vals_up)) %>%
filter(rowSums(!is.na(.)) > 1)
输出:
X Apache Belle.Isle Tolk
1 1 0.566176 0.607365 0.590499
2 2 0.588312 NA 0.631185
答案 2 :(得分:1)
将plyr
ldply
与split
一起使用
df=plyr::ldply(split(x$Diameter,x$Ash), rbind)
row.names(df)=df$.id
df$.id=NULL
df=data.frame(t(df))
df
Apache Belle.Isle Tolk
1 0.56 0.6 0.59
2 0.58 NA 0.63
答案 3 :(得分:0)
您可以先将数据框更改为矩阵,然后使用转置函数,但这可能不是您想要的,因为这样每个条目将被强制转换为字符串值。由于您的数据框非常小,因此我建议最直接的方法是:
rbind(df$Ash, df$Diameter)
df是数据框的名称