我有以下数据
x <- list(a=c(1, 2, 3),b=c(4, 5, 6),c=c(7, 8, 9))
以及使用lapply()
to_dataframe <- function(x){
d <- data.frame(Y = as.matrix(x))
}
lapply(x, to_dataframe)
输出为
$a
Y
1 1
2 2
3 3
$b
Y
1 4
2 5
3 6
$c
Y
1 7
2 8
3 9
我希望输出为
```r
$a
Y name
1 1 a
2 2 a
3 3 a
$b
Y name
1 4 b
2 5 b
3 6 b
$c
Y name
1 7 c
2 8 c
3 9 c
我很难将name
列的值设置为对象名称。从这一点上我该怎么办?
答案 0 :(得分:2)
您可以使用stack
将命名向量更改为数据帧。
temp <- stack(x)
temp
# values ind
#1 1 a
#2 2 a
#3 3 a
#4 4 b
#5 5 b
#6 6 b
#7 7 c
#8 8 c
#9 9 c
如果希望将它们作为列表,则可以split
进行操作:
split(temp, temp$ind)
#$a
# values ind
#1 1 a
#2 2 a
#3 3 a
#$b
# values ind
#4 4 b
#5 5 b
#6 6 b
#$c
# values ind
#7 7 c
#8 8 c
#9 9 c
在purrr
中,您可以使用imap
purrr::imap(x, ~tibble(Y = .x, name = .y))
答案 1 :(得分:1)
您可以尝试:
Map(cbind, lapply(x, to_dataframe), name = names(x))
$a
Y name
1 1 a
2 2 a
3 3 a
$b
Y name
1 4 b
2 5 b
3 6 b
$c
Y name
1 7 c
2 8 c
3 9 c
答案 2 :(得分:1)
为避免name
列中的因素,您可以这样做
res <- Map(`[<-`, lapply(x, to_dataframe), "name", value=names(x))
res
# $a
# Y name
# 1 1 a
# 2 2 a
# 3 3 a
#
# $b
# Y name
# 1 4 b
# 2 5 b
# 3 6 b
#
# $c
# Y name
# 1 7 c
# 2 8 c
# 3 9 c
str(res)
# List of 3
# $ a:'data.frame': 3 obs. of 2 variables:
# ..$ Y : num [1:3] 1 2 3
# ..$ name: chr [1:3] "a" "a" "a"
# $ b:'data.frame': 3 obs. of 2 variables:
# ..$ Y : num [1:3] 4 5 6
# ..$ name: chr [1:3] "b" "b" "b"
# $ c:'data.frame': 3 obs. of 2 variables:
# ..$ Y : num [1:3] 7 8 9
# ..$ name: chr [1:3] "c" "c" "c"
或者重写您的函数并使用Map
。
to_dataframe <- function(x, y) {
data.frame(Y=x, name=y, stringsAsFactors=FALSE)
}
res <- Map(to_dataframe, x, names(x))