我一直在为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。我敢肯定,我缺少一些很容易实现此目的的东西。谢谢您的帮助。
答案 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)