Переписать цикл for как функцию lapply в R - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть несколько файлов, которые содержат ряд чисел. Я хочу узнать, каковы общие числа во всех файлах. например

a.txt
1
2
3
4

b.txt
2
4
9

c.txt
2
3
4
8
10

Выход: 2, 4

Код, который я написал, используя циклы for, дает мне правильный результат.

fileList = c("a.txt", "b.txt", "c.txt")

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

  tempDF = read.table(fileList[1], header = T, stringsAsFactors = F)

  if(i == 1){

    commons = tempDF$x

  }else{
    commons = intersect(commons, tempDF$x)
  }

}

print(commons)

Однако у меня возникли некоторые проблемы при переписывании с использованием функции lapply. Как lapply сохраняет значение переменных «commons» без замены?

lapply(fileList, function(x) getCommons(x))

getCommons <- function(file){

  fileData = read.table(file, header = T, stringAsFactor = F)

  commons = intersect(commons, fileData)

}

1 Ответ

0 голосов
/ 29 апреля 2018

Вы могли бы использовать Reduce здесь. И поскольку в каждом файле есть один столбец, который не обязательно является фреймом данных (без имени столбца), мы можем заменить read.table на scan. Это создаст список из трех числовых векторов, что облегчит и ускорит поиск пересечения.

Reduce(intersect, lapply(files, scan, quiet = TRUE))
# [1] 2 4

Создание данных:

write(1:4, file = "a.txt", sep = "\n")
write(c(1, 2, 4, 9), file = "b.txt", sep = "\n")
write(c(2, 3, 4, 8, 10), file = "c.txt", sep = "\n")
files <- c("a.txt", "b.txt", "c.txt") 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...