在 R 中转置数据帧并维护第一列

问题描述 投票:0回答:1

我需要在 R 中转置一个数据帧,使第一列成为转置后的 df 的标题,当前列的标题为 df 第 1 列中的值。像这样-

df = 

 | |S1|S2|S3|
1|A|1 |2 | 3|
2|B|1 |2 | 3|

df_transposed = 

 |  |A |B |
1|S1|1 |1 |
2|S2|2 |2 |
3|S3|3 |3 |

我可以使用本示例中的以下代码实现部分目的 - 转置将第一列维护为标题的数据框

# Sample data frame
df <- data.frame(
  ID = c(10, 20, 30),
  Name = c("Alice", "Bob", "Charlie"),
  Age = c(25, 30, 22)
)

# Transpose the data frame
df_transposed <-setNames(data.frame(t(df[,-1])), df[,1])

但每次它都会获取列标题值(在本例中为

'ID','Name','Age'
),并将它们设置为索引(或 r 说法中的 row.name )。我尝试了各种解决方案,但到目前为止没有任何效果。它们主要面向相反的方向 - 获取第一列并将其设为索引/行名称。

r dataframe dplyr tidyverse transpose
1个回答
1
投票

我想你正在寻找这个。

> setNames(data.frame(names(df)[-1], t(unname(df[, -1]))), c('Row.names', df[, 1]))
  Row.names    10  20      30
1      Name Alice Bob Charlie
2       Age    25  30      22

但请注意,以数字开头的列名称在语法上不被视为有效,请参阅

?make.names
对此。

要自动获取有效名称,我们可以利用

data.frame
,它在内部执行
make.names

> data.frame(`colnames<-`(cbind(names(df)[-1], t(unname(df[, -1]))), c('Row.names', df[, 1])))
  Row.names   X10 X20     X30
1      Name Alice Bob Charlie
2       Age    25  30      22

数据:

> dput(df)
structure(list(ID = c(10, 20, 30), Name = c("Alice", "Bob", "Charlie"
), Age = c(25, 30, 22)), class = "data.frame", row.names = c(NA, 
-3L))
© www.soinside.com 2019 - 2024. All rights reserved.