我需要在 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 )。我尝试了各种解决方案,但到目前为止没有任何效果。它们主要面向相反的方向 - 获取第一列并将其设为索引/行名称。
我想你正在寻找这个。
> 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))