Пересечение многих файлов CSV на основе определенного столбца - PullRequest
0 голосов
/ 25 июня 2019

У меня есть много CSV-файлов в одном каталоге.Все файлы имеют одинаковую структуру столбцов, например:

Class    val1  val2
A        6.5   2.3
F        9     6.8

Я хотел бы найти имена классов, которые существуют во всех файлах CSV.Другими словами, я хотел бы получить пересечение всех файлов на основе столбца Class и независимо от значений в val1 и val2.

Я применил следующее:

temp = list.files(pattern="*.csv")
myfiles = lapply(temp, read.delim)
x <- Reduce(intersect,myfiles)

Но это приведет к извлечению схожих классов с аналогичными значениями, которые я не хочу.Я хочу только имя классов, которые есть во всех файлах.

1 Ответ

1 голос
/ 25 июня 2019

Просто запустите объединение цепей без all=TRUE.Если окончательный фрейм данных пуст, то NO Class соответствует ВСЕМ наборам данных.Чтобы избежать конфликтов имен с merge, необходим шаг для динамического переименования столбцов.Ниже добавляются подчеркивания суффиксов к соответствующему номеру элемента списка.

temp <- list.files(pattern="*.csv")
myfiles <- lapply(temp, read.delim)

# RENAME val1 and val2 COLUMNS TO AVOID merge CONFLICT
myfiles <- lapply(seq_along(myfiles), function(i) 
              setNames(myfiles[[i]], c("Class", paste0("val1_", i), paste0("val2_", i)))) 

# CHAIN MERGE
final_df <- Reduce(function(x, y) merge(x, y, by="Class"), myfiles)

# UNIQUE Class NAMES
unique(final_df$Class)

В качестве альтернативы, складывают все кадры данных и возвращают частоту, равную длине myfiles :

temp <- list.files(pattern="*.csv")
myfiles <- lapply(temp, read.delim)

# ROW BIND ALL DFs
stack_df <- do.call(rbind, myfiles)

# RETURN VECTOR OF CLASS VALUES AND COUNTS
freqs <- table(stack$Class)

# RETURN NAME WITH VALUE COUNT EQUAL LENGTH OF myfiles
names(freqs[freqs == length(myfiles)])

Rextester demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...