Отфильтруйте имена переменных из кодовой книги и примените сводную функцию

#r #dataframe #function

Вопрос:

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

 Add_year_var <- function(Data, navn){
Years <-  unique(Data$Aar)
Data <- Data %>%
  distinct(Aar, .keep_all = TRUE) %>% 
  pivot_longer(Aar, values_to = "year")
NewData <- KomSPSS %>%
select(ID, Data$variable)
colnames(NewData) <- c("Kommune", Years)
NewData <- NewData %>%
 pivot_longer(2:ncol(NewData), names_to = "year", values_to = navn)
}
 

На основе поиска переменной в кодовой книге с помощью filter(str_detect(Desc, "name_here") , создания нового фрейма данных, к которому я могу применить функцию. Затем эти новые данные были объединены в третий фрейм данных, содержащий все переменные.

Однако данные содержат почти 2000 переменных, поэтому выполнение этого вручную займет значительное количество времени. Поэтому я задался вопросом, есть ли способ сделать это для всех строк сразу, используя либо функцию apply, либо цикл for. Однако, используя их, я не смог понять, как отфильтровать, какие переменные принадлежат друг другу, и как их назвать. Я попытался создать новую функцию, содержащую:

 FltDes <- function(name){
       filter(str_detect(Desc, name)
      }
 

Сделав это частью описанной выше функции, я планировал, что затем смогу присвоить каждой строке в кодовой книге аргумент «имя», однако это не позволило использовать аргумент » имя » в качестве шаблона для функции str_detect. Есть какие-нибудь подсказки о том, как это можно сделать? Мы ценим любую помощь!

Изменить: Новые кадры данных

Данные состоят из двух фреймов данных, один из которых содержит данные, а другой показывает название и год для каждого столбца в данных.

Кодовая книга:

ID Aar Описание позиция переменная
2 1 1898 Effektivt stemmeberettigede: I alt 1338 V1338
6 2 1901 Stemmeberettigede: Kvinner 1343 V1343
7 3 1901 Effektivt stemmeberettigede: Menn 1345 V1345
5 4 1901 Stemmeberettigede: Menn 1342 V1342
4 5 1901 Antall valgsogn 1341 V1341
21 6 1901 Effektivt stemmeberettigede: I alt 1347 V1347
3 7 1907 Effektivt stemmeberettigede: I alt 1373 V1373
41 8 1910 Effektivt stemmeberettigede: I alt 1381 V1381

Data/KomSPSS:

V1338 V1343 V1345 V1342 V1341 V1347 V1373 V1381 ID
1 972 1225 1648 1732 1 2871 3128 3995 1
2 409 702 799 838 1 1492 2196 2953 2
3 1138 1628 2037 2143 1 3660 4462 5227 3
4 694 1058 1278 1345 1 2314 2537 3095 4
5 511 451 650 660 1 1101 1258 1461 5
6 468 610 935 963 2 1545 1752 2234 6
7 143 128 225 235 1 353 408 508 7
8 496 444 890 925 3 1334 1621 2011 8

From the codebook I then make a new dataframe, containing a unique description:

 NewData <- Codebook %>%
         filter(str_detect("Effektivt stemmeberettigede: I alt")
 

To this new dataframe I can then apply the function:

 Result <- add_year_variable(NewData, 
          "Effektivt_stemmeberettigede_I_alt")
 

Resulting in this final dataframe:

Kommune year Effektivt_stemmeberettigede_I_alt
1 1 1898 972
2 1 1901 1225
3 1 1907 3128
4 1 1910 3995
5 2 1898 409
6 2 1901 702
7 2 1907 2196
8 2 1910 2953
9 3 1898 1138
10 3 1901 1628
11 3 1907 4462
12 3 1910 5227
13 4 1898 694
14 4 1901 1058
15 4 1907 2537
16 4 1910 3095
17 5 1898 511
18 5 1901 451
19 5 1907 1258
20 5 1910 1461
21 6 1898 468
22 6 1901 610
23 6 1907 1752
24 6 1910 2234
25 7 1898 143
26 7 1901 128
27 7 1907 408
28 7 1910 508
29 8 1898 496
30 8 1901 444
31 8 1907 1621
32 8 1910 2011

Комментарии:

1. хорошо, я вижу Данные-df и Кодовую книгу. Как выглядит ваш ожидаемый результат?

2. Спасибо вам за ответ! Я добавил правку, показывающую, каким я надеюсь быть результатом

3. Ваши первые данные.состояния фрейма для идентификатора 1 и V1 значения 23 . Ваша вторая («Кодовая книга») имеет для идентификации 1 pos V1 . Как создать столбец SailorsAtSea для идентификатора 1 и года 1991 со значением 3 ?

4. Это была просто опечатка, вы абсолютно правы, что не имело бы смысла

5. Я действительно хочу помочь вам решить вашу проблему, но на самом деле я не понимаю вашей логики, как составить желаемый вывод из исходных двух наборов данных. Теперь вы заявили, что была опечатка. Как выглядит исправленная версия?

Ответ №1:

Допустим, ваши данные выглядят так, как показано выше.

Сначала мы фильтруем «Effectivt_stemmeberettigede:_I_alt»:

 library(tidyverse)

codebook <- codebook %>% 
  filter(Desc == "Effektivt_stemmeberettigede:_I_alt")
 

Далее мы объединяем codebook и data :

 data %>% 
  pivot_longer(-ID, names_to="variable") %>% 
  left_join(codebook, by=c("ID", "variable")) %>% 
  select(Kommune = ID, year = Aar, Desc, value) %>% 
  drop_na() %>% 
  pivot_wider(names_from="Desc")
 

который возвращает

 # A tibble: 4 x 3
  Kommune  year `Effektivt_stemmeberettigede:_I_alt`
    <dbl> <dbl>                                <dbl>
1       1  1898                                  972
2       6  1901                                 1545
3       7  1907                                  408
4       8  1910                                 2011