使用lapply使对象名称成为数据框中的新列

时间:2020-03-13 03:01:50

标签: r lapply

我有以下数据

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列的值设置为对象名称。从这一点上我该怎么办?

3 个答案:

答案 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))
相关问题