Вот три варианта.Все они используют na.locf0
из зоопарка и вектор cn
, показанный только в первом.
1) Пусть cn
будет вектором такой же длины, что и my_info
, которыйопределяет номер столбца вывода, к которому принадлежит элемент my_info
.Пусть cdef
будет вектором определения выходного столбца 1: 4 с именами выходного столбца в качестве имен.Затем для каждого выходного столбца создайте вектор такой же длины, что и my_info
, строки которого соответствуют этому столбцу, и NA для других элементов.Затем используйте na.locf0
, чтобы заполнить значения NA и взять элементы, соответствующие столбцу 4.
library(zoo)
cn <- (my_info %in% food_type) + 2 * (my_info %in% region)
cn[cn == 0] <- 3:4
cdef <- c(food_type = 1, region = 2, food = 3, location = 4)
m <- sapply(cdef, function(i) na.locf0(ifelse(cn == i, my_info, NA))[cn == 4])
, что дает:
> m
food_type region food location
[1,] "Fruits" "North America" "Apples" "Michigan"
[2,] "Fruits" "Europe" "Pomegranates" "Greece"
[3,] "Fruits" "Europe" "Oranges" "Italy"
[4,] "Vegetables" "North America" "Potatoes" "Idaho"
[5,] "Vegetables" "North America" "Avocados" "California"
[6,] "Vegetables" "Europe" "Artichokes" "Italy"
[7,] "Meats" "North America" "Beef" "Illinois"
Мы создали вывод матрицы символов, так как выводполностью символьный, но если вам все равно нужен фрейм данных, используйте:
as.data.frame(mm, stringsAsFactors = FALSE)
2) В качестве альтернативы, мы можем создать m
из cn
, поместив my_info[i]
в положение (i, cn [i]) nx 4-мм матрицы NA, используя na.locf
для заполнения NA и взяв те строки, которые соответствуют столбцу 4.
n <- length(my_info)
m2 <- na.locf(replace(matrix(NA, n, 4), cbind(1:n, cn), my_info))[cn == 4, ]
colnames(m2) <- c("food_type", "region", "food", "location")
identical(m2, m) # test
## [1] TRUE
3) Третий вариант создания m
из cn
состоит в том, чтобы построить столбец матрицы за столбцом так:
m3 <- cbind( food_type = na.locf0(ifelse(cn == 1, my_info, NA))[cn == 3],
region = na.locf0(ifelse(cn == 2, my_info, NA))[cn == 3],
food = my_info[cn == 3],
location = my_info[cn == 4])
identical(m, m3) # test
## [1] TRUE