使用lapply和dplyr select无法更改/删除数据框列表中的列?

时间:2017-11-20 10:57:22

标签: r dataframe lapply data-manipulation

我有一个数据框列表L:

vec1 <- c("a", "b", "c", "d")
val <- c(11, 5443, 552, 9)
vec2 <- c("r", "p", "h", "y") 
val <- c(5, 9, 47, 23)

创建数据框:

df1 <- data.frame(vec1, val, stringsAsFactors = FALSE)
df2 <- data.frame(vec2, val, stringsAsFactors = FALSE)

L <- list(df1, df2)

现在我想删除val列,例如:

P <- lapply(L, function (y) {y$val <- NULL})

输出:

P <- lapply(L, function (y) {y$val <- NULL})
> P
[[1]]
NULL

[[2]]
NULL

手动运行:

L[[1]]$val <- NULL
L
[[1]]
  vec1
1    a
2    b
3    c
4    d

[[2]]
  vec2 val
1    r   5
2    p   9
3    h  47
4    y  23

出于某种原因,我无法做到这一点,但手动完成它,请指教。

P.S 我得到了列表(我没有创建它),并且无法访问val,因为R不知道它是什么。

Error in overscope_eval_next(overscope, expr) : 
  object 'val' not found 

使用dplyr select时,找不到val列:

library(dplyr)
P <- lapply(L, function (y) {select(y, -val)})

1 个答案:

答案 0 :(得分:1)

这两个命令对我有用:

library(dplyr)

vec1 <- c("a", "b", "c", "d")
val <- c(11, 5443, 552, 9)
vec2 <- c("r", "p", "h", "y") 
val <- c(5, 9, 47, 23)

df1 <- data.frame(vec1, val, stringsAsFactors = FALSE)
df2 <- data.frame(vec2, val, stringsAsFactors = FALSE)

L <- list(df1, df2)

L

# [[1]]
#   vec1 val
# 1    a   5
# 2    b   9
# 3    c  47
# 4    d  23
# 
# [[2]]
#   vec2 val
# 1    r   5
# 2    p   9
# 3    h  47
# 4    y  23

lapply(L, function (y) {y$val <- NULL; y})

# [[1]]
# vec1
# 1    a
# 2    b
# 3    c
# 4    d
# 
# [[2]]
# vec2
# 1    r
# 2    p
# 3    h
# 4    y

lapply(L, function (y) {select(y, -val)})

# [[1]]
# vec1
# 1    a
# 2    b
# 3    c
# 4    d
# 
# [[2]]
# vec2
# 1    r
# 2    p
# 3    h
# 4    y