Проблемы с привязкой столбцов из двух фреймов данных с использованием цикла for в R - PullRequest
0 голосов
/ 11 октября 2018

У меня есть 7 из двух разных asc файлов, загруженных в R, asc[i] и wasc[i], [i] означает, что в R. загружено 1: 7 ascs и wascs. Мне нужно объединитьwasc[i] с asc[i][[1]] (просто первый столбец в asc[i] со всем файлом wasc[i]).

Это должно повторяться для каждой пары файлов asc и wasc.

Код продолжает давать мне пустые фреймы данных, поэтому я не знаю, почему это не работает,Имена правильные, но код не распознает, что asc[i] и wasc[i] коррелируют с ранее загруженными файлами.

Любая помощь будет принята с благодарностью.

# These data frames will reproduce my issue 

asc1 <- data.frame(x= c(rep("A.tif", 20)), y = 1:20)
wasc1 <- data.frame(x= c(rep("B.tif", 20)), y = c(rep("Imager",20)))

asc2 <- data.frame(x= c(rep("A.tif", 20)), y = 1:20)
wasc2 <- data.frame(x= c(rep("B.tif", 20)), y = c(rep("Imager",20)))

asc3 <- data.frame(x= c(rep("A.tif", 20)), y = 1:20)
wasc3 <- data.frame(x= c(rep("B.tif", 20)), y = c(rep("Imager",20)))


for (i in 1:3) {
      d <- paste("asc", i, sep ="")
      f <- paste("wasc", i, sep ="")
      full_wing <- as.character(paste("full_wing", i, sep = ""))
      assign(full_wing,cbind(d[[1]], f))
    }

# Output of full_wing1 data frame

dput(full_wing1)

structure(c("asc1", "wasc1"), .Dim = 1:2, .Dimnames = list(NULL, 
c("", "f")))

Дополнительная информация:

  1. файлы asc имеют длину 19 столбцов
  2. файлы wasc имеют длину 13 столбцов

I onlyхотите объединить столбец 1 из файла asc со всем файлом wasc, вырезав таким образом оставшиеся 18 столбцов файла asc.

1 Ответ

0 голосов
/ 11 октября 2018
# put data in a list
asc = mget(ls(pattern = "^asc"))
wasc = mget(ls(pattern = "^wasc"))

full_wing = Map(f = function(w, a) cbind(w, a[[1]]), w = wasc, a = asc)

Map - это удобный ярлык для параллельной итерации по нескольким аргументам.Возвращает хороший list.Вы можете получить доступ к отдельным элементам, например, full_wing[[1]], full_wing[[3]] и т. Д. Map - это просто ярлык, приведенный выше код в основном эквивалентен приведенному ниже циклу for:

results = list()
for (i in seq_along(asc)) {
    results[[i]] = cbind(wasc[[i]], asc[[i]][[1]])
}

Я использую mget, чтобы поместить данные в список, потому что в вашем примере у вас уже есть такие объекты, как asc1, asc2 и т. Д. Гораздо лучший способ - никогда не создавать эти переменные, вместо этогочитать файлы прямо в список, что-то вроде этого:

asc_paths = list.files(pattern = "^asc")
asc = lapply(asc_paths, read.table)

Более подробное объяснение этого можно найти на Как составить список фреймов данных?

Если вам когда-либо понадобится только один столбец файлов asc, то другим способом упростить это будет чтение только в нужном столбце, см. Чтение только ограниченного числа столбцов для получения некоторых рекомендаций.

...