【问题标题】:Unknown result of select command选择命令的未知结果
【发布时间】:2019-08-19 13:38:58
【问题描述】:

我有多个 .csv 文件(mydata_1mydata_2、...),它们具有相同数量的列和列名(如果有助于找到答案,则行长不同)。在将它们读入我的环境后,他们就有了 data.frame 类。我将它们全部放在 list 中,现在想按名称从所有这些列中 select 特定列,导致只有选定的列具有相同的变量名称。

mydata_1 = matrix(c(1:21), nrow=3, ncol=7,byrow = TRUE) 
mydata_2 = matrix(c(1:21), nrow=3, ncol=7,byrow = TRUE) 
 colnames(mydata_1) = c(paste0("X","1":"7"))
 colnames(mydata_2) = c(paste0("X","1":"7"))

df1 = as.data.frame(mydata_1)
df2 = as.data.frame(mydata_2)

all_data = c(df1, df2)

class(all_data)
class(df1)

for (i in all_data){
  i = select(i,"X3":"X5")
  }

我的for 命令将输出 data.frames df1df2,只有三列(而不是之前的七列),但是在运行代码时会出现关于 select 命令的错误消息。

UseMethod("select_") 中的错误: 'select_' 没有适用的方法应用于类“c('integer','numeric')”的对象

如何获得新的dfs 的工作输出?

【问题讨论】:

  • select 不是基本 R 函数。根据r 标签(悬停查看):使用library() 调用指定所有非基础包

标签: r dataframe for-loop select


【解决方案1】:

这里的第一个问题是您正在尝试使用c(df1, df2) 创建一个列表,而您必须使用list(df1, df2)

数据

library(dplyr)
library(purrr)

mydata_1 = matrix(c(1:21), nrow=3, ncol=7,byrow = TRUE) 
mydata_2 = matrix(c(1:21), nrow=3, ncol=7,byrow = TRUE) 
colnames(mydata_1) = c(paste0("X","1":"7"))
colnames(mydata_2) = c(paste0("X","1":"7"))

df1 = as.data.frame(mydata_1)
df2 = as.data.frame(mydata_2)

all_data = list(df1 = df1, df2 = df2)

第二个问题在您的循环中。看,在这种方法中,您必须在运行循环之前创建一个空列表,然后在每次迭代中聚合元素。

all_data2 <- list()

for(i in 1:length(all_data)) {

all_data2[[i]] <- all_data[[i]] %>% select(X3, X4, X5)

}

尝试使用 purrr 中的 map,它是 tidyverse 包的一部分,并产生具有相同结果的更简洁的代码。

# Down here the `.x` is replaced by each element of the list all_data
# in each iteration, ending wiht a list of two data frames

all_data2 = map(all_data, ~.x %>%
                select(X3, X4, X5))

【讨论】:

    【解决方案2】:

    考虑使用基本 R 的 subsetselect 参数进行连续列选择,包装在 lapply 调用中。与for 循环不同,lapply 不需要簿记将每个元素重新分配回列表:

    all_data <- list(df1 = df1, df2 = df2)
    
    all_data_sub <- lapply(all_data, function(df) subset(df, select=X3:X5))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多