如何在R中对数据框进行转置,并将其中一列设置为新转置表的标题?

23

在R中,最好的转置数据框并将其中一列设置为新转置表头的方法是什么?我已经编写了下面的代码来完成此操作。由于我还是R的新手,希望能提出改进我的代码以及更符合R语言风格的替代方案。不幸的是,我的解决方案有点硬编码(即新列标题在某个特定位置)。

# Assume a data.frame called fooData
# Assume the column is the first column before transposing

# Transpose table
fooData.T <- t(fooData)

# Set the column headings
colnames(fooData.T) <- test[1,]

# Get rid of the column heading row
fooData.T <- fooData.T[2:nrow(fooData.T), ]

#fooData.T now contains a transposed table with the first column as headings

可能是R-转置数据框的重复问题。 - Waldir Leoncio
使用as.data.frame(t(df)),行名和列名被转置,数据保持为数值型。其中,df 是一个数据框。 - PatrickT
7个回答

26

你可以通过两步来完成,使用下列方法:

# Transpose table YOU WANT
fooData.T <- t(fooData[,2:ncol(fooData)])

# Set the column headings from the first column in the original table
colnames(fooData.T) <- fooData[,1] 

你可能已经知道,由于转置时的类别问题,结果是一个矩阵。我认为没有一种单行的方法可以解决这个问题,因为在转置步骤中缺乏命名能力。


好的观点,据我所知,这应该会使它更快,因为它需要转置的数据更少。而且看起来更整洁。矩阵问题是我也遇到的问题之一,我不得不使用一个类(fooData.T) <- "numeric",这对于任何其他数据类型都不起作用。 - themartinmcfly
我将这个答案作为唯一的选择,这在编程中很奇怪,因为通常有多种解决方法。 - themartinmcfly
3
第二条指令存在问题,应该改为colnames(fooData.T) <- t(fooData[,1]) - domi

3
你甚至可以在一行中完成它:
fooData.T <- setNames(data.frame(t(fooData[,-1])), fooData[,1])

已经有很好的答案了。然而,对于那些在代码中更喜欢简洁的人来说,这个答案可能会很有用。


1

这里是另一种来自这里tiyderse/dplyr方法。

mtcars %>%
  tibble::rownames_to_column() %>%  
  tidyr::pivot_longer(-rowname) %>% 
  tidyr::pivot_wider(names_from=rowname, values_from=value)

1

使用 data.table 中的 transpose,假设您想要在转置后将其作为标题使用的列是变量 group

fooData.transpose = fooData %>% transpose (make.name = "group")

此外,如果您想为转置后的列指定名称,请使用参数keep.names
fooData.transpose = fooData %>% transpose (make.name = "group", keep.names = "column_name")

1

以下是我的建议,使用dplyr处理带有分组列和id列的data.frame

id_transpose <- function(df, id){
  df %>% 
    ungroup() %>% 
    select(where(is.numeric)) %>% 
    t() %>% 
    as_tibble() %>% 
    setNames(., df %>% pull({{id}}))
}

0
现在有一个专门用于转置数据框的函数,来自于sjmisc包中的rotate_df。如果所需名称在原始df的第一列中,则可以通过cn参数在一行中实现此操作。
以下是一个示例数据框:
df <- data.frame(name = c("Mary", "John", "Louise"), class = c("A", "A", "B"), score = c(40, 75, 80))

df
#    name class score
#1   Mary     A    40
#2   John     A    75
#3 Louise     B    80

使用cn = T执行该函数:

rotate_df(df, cn = T)

#      Mary John Louise
#class    A    A      B
#score   40   75     80

-3

我曾经遇到过类似的问题——我有一个因子变量,格式为长格式,我希望每个因子都成为一个新的列标题;使用统计库中的“unstack”一步完成。如果您想要作为标题的列不是因子,则可以尝试使用重塑库中的“cast”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接