使用循环从列表中选择列名称

时间:2019-04-26 20:14:08

标签: r

我一直在为R中的列表进行列选择而苦苦挣扎。我已经加载了一堆csv(全部具有不同的列名和不同的列数),目的是提取所有具有相同名称的列(只是phone_number,subregion和phonetype),然后将它们放到一个数据框中。

我可以从一个列表元素中得到想要的列;      var<-data[[1]] %>% select("phone_number","Subregion", "PhoneType")
但是我不能以此方式从列表中的所有元素中选择列,一次只能选择一个。

然后我尝试了如下所示的for循环:

    new.function <- function(a) {
  for(i in 1:a) {
   tst<-datas[[i]] %>% select("phone_number","Subregion", "PhoneType") 

  }
  print(tst)
}

但是当我尝试:

    new.function(5)

我只会从第5个元素中获取列。

我知道对于大多数人来说,这似乎是一个菜鸟问题,但是我正在努力学习列表和循环以及R。我敢肯定,我缺少一些很容易实现此目的的东西。谢谢您的帮助。

2 个答案:

答案 0 :(得分:2)

执行此操作的另一种方法是创建一个函数,该函数提取列并将其应用到lapply列表中的所有data.frames中。

library(dplyr)

extractColumns = function(x){
  select(x,"phone_number","Subregion", "PhoneType")
  #or x[,c("phone_number","Subregion","PhoneType")]
}

final_df = lapply(data,extractColumns) %>% bind_rows()

答案 1 :(得分:1)

当前设置循环的方式仅保存了循环的最后一次迭代,因为tst的存储范围不超过一个值,并且被循环的每个步骤覆盖。

您可以首先使用以下方法将tst建立为列表:

tst <- list()

然后在代码中明确指出,通过在tst中添加方括号和索引,将每个步骤另存为列表中的单独元素。这是您执行操作的完整示例。

#Example data.frame that could be in datas
df_1 <- data.frame("not_selected" = rep(0, 5),
                   "phone_number" = rep("1-800", 5),
                   "Subregion"    = rep("earth", 5),
                   "PhoneType"    = rep("flip", 5))
# Another bare data.frame that could be in datas
df_2 <- data.frame("also_not_selected" = rep(0, 5),
                   "phone_number" = rep("8675309", 5),
                   "Subregion"    = rep("mars", 5),
                   "PhoneType"    = rep("razr", 5))

# Datas is a list of data.frames, we want to pull only specific columns from all of them
datas <- list(df_1, df_2)

#create list to store new data.frames in once columns are selected
tst <- list()

#Function for looping through 'a' elements
new.function <- function(a) {

  for(i in 1:a) {

    tst[[i]] <- datas[[i]] %>% select("phone_number","Subregion", "PhoneType") 

  }

  print(tst)
}

#Proof of concept for 2 elements
new.function(2)