根据相应的行标签将行值放入列中

时间:2019-02-17 02:18:12

标签: r

我在数据框中有两列,一列是“直径”,另一列是“灰”。我试图根据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

4 个答案:

答案 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 ldplysplit一起使用

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是数据框的名称