问题描述
我有以下数据框df(实际上更大):
A B C
1 ORp0 RT1p20 RT2p20
2 RT3p0 RT4p0 RT5p0
3 RT3p0 RT4p0 RT5p05
我需要将其变成一个对象,以便结构看起来像这样
str(df)
List of 3
$ : chr [1:3] "ORp0" "RT1p20" "RT2p20"
$ : chr [1:3] "RT3p0" "RT4p0" "RT5p0"
$ : chr [1:3] "RT3p0" "RT4p0" "RT5p05"
此列表的每一行似乎都是一个向量。如何从数据框实现这种转换?
非常感谢您
解决方法
尝试一下:
#Data
df <- structure(list(A = c("ORp0","RT3p0","RT3p0"),B = c("RT1p20","RT4p0","RT4p0"),C = c("RT2p20","RT5p0","RT5p05")),class = "data.frame",row.names = c("1","2","3"))
代码:
List <- split(df,rownames(df))
输出:
List
$`1`
A B C
1 ORp0 RT1p20 RT2p20
$`2`
A B C
2 RT3p0 RT4p0 RT5p0
$`3`
A B C
3 RT3p0 RT4p0 RT5p05
如果您想进一步格式化,则可以使用下一个代码:
L2 <- lapply(List,function(x) {y <- c(t(x[1,])); return(y)})
这将输出:
L2
$`1`
[1] "ORp0" "RT1p20" "RT2p20"
$`2`
[1] "RT3p0" "RT4p0" "RT5p0"
$`3`
[1] "RT3p0" "RT4p0" "RT5p05"
类似于您想要的。正如观察时要小心行名,并检查它们从1开始到数据框中的最后观察。有时它们可能会有所不同!
,您可以使用split
:
new_list <- split(as.matrix(df),row(df))
new_list
$`1`
[1] "ORp0" "RT1p20" "RT2p20"
$`2`
[1] "RT3p0" "RT4p0" "RT5p0"
$`3`
[1] "RT3p0" "RT4p0" "RT5p05"
str(new_list)
List of 3
$ 1: chr [1:3] "ORp0" "RT1p20" "RT2p20"
$ 2: chr [1:3] "RT3p0" "RT4p0" "RT5p0"
$ 3: chr [1:3] "RT3p0" "RT4p0" "RT5p05"
,
您可以尝试以下选项:
-
asplit
+unname
> str(Map(unname,asplit(df,1)))
List of 3
$ 1: chr [1:3(1d)] "ORp0" "RT1p20" "RT2p20"
$ 2: chr [1:3(1d)] "RT3p0" "RT4p0" "RT5p0"
$ 3: chr [1:3(1d)] "RT3p0" "RT4p0" "RT5p05"
或更简单的一个(在评论中@akrun)
> str(asplit(unname(df),1))
List of 3
$ 1: chr [1:3(1d)] "ORp0" "RT1p20" "RT2p20"
..- attr(*,"dimnames")=List of 1
.. ..$ : NULL
$ 2: chr [1:3(1d)] "RT3p0" "RT4p0" "RT5p0"
..- attr(*,"dimnames")=List of 1
.. ..$ : NULL
$ 3: chr [1:3(1d)] "RT3p0" "RT4p0" "RT5p05"
..- attr(*,"dimnames")=List of 1
.. ..$ : NULL
- attr(*,"dim")= int 3
- attr(*,"dimnames")=List of 1
..$ : chr [1:3] "1" "2" "3"
-
unclass
+as.data.frame
+t
> str(unclass(as.data.frame(t(df))))
List of 3
$ 1: chr [1:3] "ORp0" "RT1p20" "RT2p20"
$ 2: chr [1:3] "RT3p0" "RT4p0" "RT5p0"
$ 3: chr [1:3] "RT3p0" "RT4p0" "RT5p05"
- attr(*,"row.names")= chr [1:3] "A" "B" "C"