Итерация (Цикл) через столбцы кадра данных в R - PullRequest
1 голос
/ 24 сентября 2019

Я борюсь в R и надеюсь, что кто-то может мне помочь.Я пытаюсь написать цикл for для итерации по столбцам фрейма данных, но, к сожалению, у меня ничего не получается.

Итак, вот моя проблема: у меня есть 10 фреймов данных (dt1, dt2, dt3,..., DT10).Например, dt1 выглядит следующим образом:

dt1<-data.frame(Topic1=c(1,2,3,4,5,6,7,8,9),Topic2=c(9,8,7,6,5,4,3,2,1), Topic3=c(1,9,2,8,3,7,4,6,5), Name=c("A","A","A","A","A","B","B","B","B"))

Я хочу проверить, содержит ли переменная Name все еще «A» и «B», когда я фильтрую, я фильтрую тему 1 (затем тему 2, тему 3…), чтобыбольше 5. На данный момент я делаю следующее

Library(dpylr)

dt.new<-dt1 %>% filter(Topic1>5)
isTRUE("A" %in% dt.new$Name && "B" %in% dt.new$Name)

В конце дня для каждого фрейма данных я хочу иметь новую таблицу (фрейм данных), которая выглядит следующим образом:

result<-data.frame(Topic=c("Topic1","Topic2","Topic3"),Return=c("FALSE","FALSE","TRUE"))

Теперь проблема в том, что у меня есть несколько фреймов данных (dt1, dt2 ...), каждый из которых имеет более 50 переменных (Topic1,…, Topic50).

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

Большое спасибо!

1 Ответ

1 голос
/ 24 сентября 2019

Можно было бы сгруппировать по «Имени», summarise переменной, имена столбцов которой начинаются с «Темы», проверив, есть ли значение any больше 5, затем gather (получениеустарел - в более новой tidyr - используйте pivot_longer) для преобразования из 'wide' в 'long', сгруппированный по столбцу 'Topic', summarise, проверив, если all элементы 'val' равны TRUE

library(dplyr)
library(tidyr)
dt1 %>%
    group_by(Name) %>% 
    summarise_at(vars(starts_with('Topic')), ~ any(. > 5)) %>%
    gather(Topic, val, -Name) %>% 
    group_by(Topic) %>% 
    summarise(Return = all(val))
# A tibble: 3 x 2
#  Topic  Return
#  <chr>  <lgl> 
#1 Topic1 FALSE 
#2 Topic2 FALSE 
#3 Topic3 TRUE  

Или сначала измените его в «длинный» формат, а затем выполните summarise ation

dt1 %>% 
   pivot_longer(cols = -Name, names_to = "Topic") %>%
   filter(value > 5) %>% 
   group_by(Topic) %>% 
   summarise(result = n_distinct(Name) == 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...