#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
posV1
. Как создать столбец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