Мы можем сделать split
in. base R
в list
из vector
s
df2 <- transform(df1, NameRemarks = paste(Name, Remarks,
sep=" - "))[, c("NameRemarks", "Occupation", "Countrycode")]
lst1 <- lapply(split(df2[-3], df2$Countrycode),
function(x) split(x['NameRemarks'], x$Occupation))
#$`1`
#$`1`$Engineer
# NameRemarks
#1 Mark - Ok
#2 Jerry - None
#$`2`
#$`2`$Shepherd
# NameRemarks
#5 Max - Ok
#$`2`$Veterinarian
# NameRemarks
#3 Marie - Ok
#4 Nolan - Ok
Формат может не подходить для записи файла. Один из вариантов: capture.output
Map(capture.output, lst1, file = paste0("output", seq_along(lst1), ".txt"))
-выход
![enter image description here](https://i.stack.imgur.com/HH0Xv.png)
Для целей хранения может быть лучше сделать один split
lst1 <- split(df2[-3], df2$Countrycode)
lapply(names(lst1), function(x) write.csv(lst1[[x]],
file = paste0("output", x, ".csv"), row.names = FALSE, quote = FALSE))
или другой вариант tidyverse
library(dplyr)
library(tidyr)
library(stringr)
df1 %>%
unite(NameRemarks, Name, Remarks, sep= " - ") %>%
group_by(Countrycode) %>%
mutate(rn = row_number()) %>%
ungroup %>%
pivot_wider(names_from = Occupation, values_from = NameRemarks)
# A tibble: 5 x 5
# Countrycode rn Engineer Veterinarian Shepherd
# <int> <int> <chr> <chr> <chr>
#1 1 1 Mark - Ok <NA> <NA>
#2 1 2 Jerry - None <NA> <NA>
#3 2 1 <NA> Marie - Ok <NA>
#4 2 2 <NA> Nolan - Ok <NA>
#5 2 3 <NA> <NA> Max - Ok
data
df1 <- structure(list(Name = c("Mark", "Jerry", "Marie", "Nolan", "Max"
), Occupation = c("Engineer", "Engineer", "Veterinarian", "Veterinarian",
"Shepherd"), Countrycode = c(1L, 1L, 2L, 2L, 2L), Remarks = c("Ok",
"None", "Ok", "Ok", "Ok")), class = "data.frame", row.names = c(NA,
-5L))