问题描述
我需要删除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
>