删除函数中R中数据框的最后一列

问题描述

我需要删除10个数据帧的最后一列,因此我决定将其放在lapply()中。我编写了一个删除col的函数,如下所示,

remove_col <- function(mydata){
  mydata = subset(mydata,select=-c(24))
}

并创建一个mylist <- (data1,data2.... data10),然后我以lapply的身份通过

lapply(mylist,FUN = remove_col)

它确实为我提供了已删除数据框的列表,但是,当我检查原始数据框时,最后一列仍然存在。 我应该如何更改代码以更改原始数据集?

解决方法

您需要将函数调用的结果分配给LHS上的输入列表:

mylist <- lapply(mylist,FUN = remove_col)

如果您使用显式的返回值定义了函数,这可能会更明显:

remove_col <- function(mydata) {
    mydata <- subset(mydata,select=-c(24))
    return(mydata)   # return the modified list/data frame
}
,

您可以使用ncol从每个数据帧中删除最后一列,而不是对要删除的列号进行硬编码。

remove_col <- function(mydata){
  mydata[,-ncol(mydata)]
}
mylist <- lapply(mylist,remove_col)

要查看原始数据框中的更改,可以为数据框列表分配名称,并使用list2env

names(mylist) <- paste0('data',seq_along(mylist))
list2env(mylist,.GlobalEnv)
,

使用基R和lapply,请注意,如果列表中所有数据框中的列超过2列,则可以从脚本中删除“,drop = F”。

> d1
  c1 c2
1  1  6
2  2  7
3  3  8
4  4  9
5  5 10
> d2
  c1 c2
1  5 10
2  4  9
3  3  8
4  2  7
5  1  6
> mylist <- list(d1,d2)
> mylist
[[1]]
  c1 c2
1  1  6
2  2  7
3  3  8
4  4  9
5  5 10

[[2]]
  c1 c2
1  5 10
2  4  9
3  3  8
4  2  7
5  1  6

> lapply(mylist,function(x) x[,1:(ncol(x)-1),drop = F] )
[[1]]
  c1
1  1
2  2
3  3
4  4
5  5

[[2]]
  c1
1  5
2  4
3  3
4  2
5  1

>