R删除除一列以外的所有列后保留列名

R删除除一列以外的所有列后保留列名,r,dataframe,R,Dataframe,我有一个数据帧列表,我想删除colsums小于等于4的所有列。所以我只想保留colsum为5或更大的列。我的测试样本在下面 我使用此代码删除列 NEWTEST = NULL for (a in 1:length(TEST)) { NEWTEST = colSums(TEST[[a]]) index = which(NEWTEST > 4) TEST[[a]] = TEST[[a]][,index]} #Change all in dataframes again for (a

我有一个数据帧列表,我想删除colsums小于等于4的所有列。所以我只想保留colsum为5或更大的列。我的测试样本在下面

我使用此代码删除列

NEWTEST = NULL
for (a in 1:length(TEST)) {
  NEWTEST = colSums(TEST[[a]])
  index = which(NEWTEST > 4)
  TEST[[a]] = TEST[[a]][,index]}

#Change all in dataframes again
for (a in 1:length(TEST)) {
  TEST[[a]] = as.data.frame(TEST[[a]])}
现在的问题是,当它只剩下1列时,就像在df2和df3中一样,列名消失了。但对我来说,列名非常重要,我需要保留它(这里我只选择了Vn,但实际上它是一个描述性的列名,在每个数据帧中都不同)

你知道我怎么能简单地保留这个名字吗

TEST = structure(list(df1 = structure(list(V1 = c(15L, 18L, 18L, 12L, 
                                           14L, 16L, 10L, 14L, 29L, 16L, 20L, 20L, 13L, 3L, 14L), V2 = c(0L, 
                                                                                                         1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 2L, 1L, 0L, 0L), V3 = c(0L, 
                                                                                                                                                                         0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), V4 = c(0L, 
                                                                                                                                                                                                                                         0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), V5 = c(0L, 
                                                                                                                                                                                                                                                                                                         0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), V6 = c(0L, 
                                                                                                                                                                                                                                                                                                                                                                         0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), .Names = c("V1", 
                                                                                                                                                                                                                                                                                                                                                                                                                                              "V2", "V3", "V4", "V5", "V6"), row.names = c(NA, 15L), class = "data.frame"), 
               df2 = structure(list(V1 = c(4L, 3L, 1L, 2L, 3L, 3L, 3L, 3L, 
                                           4L, 6L, 3L, 4L, 2L, 7L, 3L), V2 = c(0L, 0L, 0L, 0L, 0L, 0L, 
                                                                               1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), V3 = c(0L, 1L, 0L, 0L, 
                                                                                                                           0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L), V4 = c(0L, 0L, 
                                                                                                                                                                               0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), V5 = c(0L, 
                                                                                                                                                                                                                                           0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), 
                                    V6 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
                                           0L, 0L, 0L)), .Names = c("V1", "V2", "V3", "V4", "V5", 
                                                                    "V6"), row.names = c(1L, 6L, 7L, 9L, 20L, 23L, 24L, 27L, 
                                                                                         28L, 29L, 32L, 33L, 34L, 37L, 38L), class = "data.frame"), 
               df3 = structure(list(V1 = c(7L, 10L, 5L, 3L, 4L, 6L, 6L, 
                                           6L, 6L, 7L, 10L, 7L, 3L, 4L, 4L), V2 = c(0L, 0L, 0L, 0L, 
                                                                                    0L, 1L, 2L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), V3 = c(0L, 0L, 
                                                                                                                                        0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L), V4 = c(0L, 
                                                                                                                                                                                                    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), 
                                    V5 = c(0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 
                                           0L, 0L, 0L), V6 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
                                                               0L, 0L, 0L, 0L, 0L, 0L)), .Names = c("V1", "V2", "V3", 
                                                                                                    "V4", "V5", "V6"), row.names = c(1L, 19L, 20L, 21L, 22L, 
                                                                                                                                     23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 38L, 39L), class = "data.frame")), .Names = c("df1", 
                                                                                                                                                                                                                           "df2", "df3"))

我们可以使用
lappy
列表上循环,使用
colSums
创建条件,并将其用作列索引。请注意,默认情况下,如果我们使用不带逗号的索引或列名,则在
data.frame

lapply(TEST, function(x) x[colSums(x) >= 5])

或使用
tidyverse

library(purrr)
library(dplyr)
map(TEST, ~ .x %>%
              select(where(~ sum(.) >= 5)))

OP行为的原因是基于
data.frame
中的
drop=TRUE
,当存在一行/列时,即它将其维度降低为返回向量。在这种情况下,我们可以只使用列索引子集,而不使用
,或者如果使用
,则确保指定
drop=FA伦敦证交所

lapply(TEST, function(x) x[, colSums(x) >= 5, drop = FALSE])

谢谢,这似乎保留了名字!