Напишите файлы для фильтра нескольких столбцов - PullRequest
1 голос
/ 03 февраля 2020

Учитывая data.frame и набор столбцов, я хотел бы написать CSV-файл (или текстовый файл в целом) для каждого столбца, содержащий, но содержащий информацию для всех столбцов, однако строки фильтруются на основе соответствующего столбца.

Например, скажем, я хочу сохранить файл для каждого, Sepal.Width и Sepal.Length , содержащий top 5 строк для каждого соответственно:

top_n(iris, 5, Sepal.Width) 
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1          5.4         3.9          1.7         0.4  setosa
# 2          5.8         4.0          1.2         0.2  setosa
# 3          5.7         4.4          1.5         0.4  setosa
# 4          5.4         3.9          1.3         0.4  setosa
# 5          5.2         4.1          1.5         0.1  setosa
# 6          5.5         4.2          1.4         0.2  setosa
# this should go in top5_Sepal.Width.csv
top_n(iris, 5, Sepal.Length)
#   Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
# 1          7.7         3.8          6.7         2.2 virginica
# 2          7.7         2.6          6.9         2.3 virginica
# 3          7.7         2.8          6.7         2.0 virginica
# 4          7.9         3.8          6.4         2.0 virginica
# 5          7.7         3.0          6.1         2.3 virginica
# this should go in top5_Sepal.Length.csv

Я пробовал что-то подобное ниже, однако я не знаю, чтобы написать функцию mywrite, то есть как получить доступ ко всему data.frame для фильтрации (только .x) содержит столбец)

myvars <- c("Sepal.Width", "Sepal.Length")
tmp <- iris %>%
  map_at(myvars, ~mywrite(.x))

В качестве альтернативы, purrr:map2 позволяет отслеживать имена, но не входит в _at (я думаю, фильтрация может быть сделана в mywrite тогда .. Однако, опять нет доступа ко всему ирису data.frame:

tmp <- iris %>%
  map2(., colnames(iris), ~mywrite(.x, .y))

В качестве третьего варианта, я думаю, есть опция l oop над именами столбцов, возможно, с использованием аккуратной оценки, то есть mycol <- sym(myvars[i]) и !!mycol, но в идеале хотел воздержаться от циклов for.

Обратите внимание, это несколько глупый игрушечный пример, который служит только для иллюстрации проблемы.

Note2, этот ответ аналогичен, но основан на группах внутри столбца, а не отдельных столбцах:

1 Ответ

2 голосов
/ 03 февраля 2020

Мы можем использовать map с нестандартной оценкой, чтобы получить 5 лучших значений для каждого myvars

library(dplyr)
purrr::map(myvars, ~top_n(iris, 5, !!sym(.x)))

#[[1]]
#  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1          5.4         3.9          1.7         0.4  setosa
#2          5.8         4.0          1.2         0.2  setosa
#3          5.7         4.4          1.5         0.4  setosa
#4          5.4         3.9          1.3         0.4  setosa
#5          5.2         4.1          1.5         0.1  setosa
#6          5.5         4.2          1.4         0.2  setosa

#[[2]]
#  Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
#1          7.7         3.8          6.7         2.2 virginica
#2          7.7         2.6          6.9         2.3 virginica
#3          7.7         2.8          6.7         2.0 virginica
#4          7.9         3.8          6.4         2.0 virginica
#5          7.7         3.0          6.1         2.3 virginica

Если вы хотите записать каждую часть в csv, вы можете расширить канал до

map(myvars, ~top_n(iris, 5, !!sym(.x)) %>% write.csv(paste0("top5_", .x, ".csv")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...