Как установить поднабор фрейма данных, используя переменную из другого фрейма данных - PullRequest
0 голосов
/ 05 марта 2020

У меня есть следующий вопрос о том, как подставить в фрейм данных для l oop, используя другой фрейм данных для вставки значений в для l oop.

bf=read.csv('Branched_Fields.csv')

bf

  ID    field1 field1a field1b field2 field2a error loc
1 1000     NA       1       1      1       2          
2 1001      1       2       2      2      NA          
3 1003     NA       1       3      2       2          
4 1202      1      NA      NA      2      NA          
5 1345      2      NA      NA     NA       2          
6 1234      2       2       3      2      NA          
7 1234     NA      NA       3     NA       2          
8 4564     NA       2      NA      2       2 

bf$error <- ""
bf$loc <- ""

bf - это фрейм данных с 8 идентификаторами, которые завершили опрос с ответами на вопросы из предыдущих вопросов. Я хочу создать подмножество данных со списком идентификаторов, которые не ответили на каждый вопрос опроса, но я хочу, чтобы экземпляр NA был включен в список только в том случае, если респондент опроса должен был увидеть вопрос.

Приведенный ниже код хорошо работает для записи во фрейм данных, «объединенный» с идентификатором каждого экземпляра NA, и где находится NA (какое поле).

field1 <- subset(bf, is.na(field1), select=c(ID, error))
field1$error="field1 = NA"
combined <- field1

field1a <- subset(bf, field1>0 & is.na(field1a), select=c(ID, error))
field1a$error="field1a = NA"
combined <- field1a

field1b <- subset(bf, field1>0 & is.na(field1b), select=c(ID, error))
field1b$error="field1a = NA"
combined <- field1b

field2 <- subset(bf, is.na(field2), select=c(ID, error))
field2$error="field1a = NA"
combined <- field2

field2a <- subset(bf, field2>0 & is.na(field2a), select=c(ID, error))
field2a$error="field1a = NA"
combined <- field2a

Это приводит к приведенному ниже кадру данных, что именно то, что мне нужно. Но мне нужно сделать это с помощью опроса с более чем 1000 вопросов. Могу ли я сделать для l oop или функцию для этого?

     ID        error
1  1000  field1 = NA
3  1003  field1 = NA
7  1234  field1 = NA
8  4564  field1 = NA
4  1202 field1a = NA
5  1345 field1a = NA
41 1202 field1a = NA
51 1345 field1a = NA
52 1345 field1a = NA
71 1234 field1a = NA
2  1001 field1a = NA
42 1202 field1a = NA
6  1234 field1a = NA

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

Это фрейм данных fl

Field_Name   Branched         Label
1     field1            field1 = NA
2    field1a field1>0 field1a  = NA
3    field1b field1>0 field1b  = NA
4     field2           field2  = NA
5    field2a field2>0 field2a  = NA

Я очень плохо знаком с R и не знаю много о циклах, и я знаю, что это неправильно, но я думал именно об этом.

for row in fl, 
     fl$Field_Name <- subset(bf, is.na(fl$Field_Name), select=c(ID, error))
     fl$Field_Name=fl$Label
     combined <- field2

В этом случае я не знаю, как справиться со случаем, когда некоторые вопросы разветвляются от других, а некоторые нет.

Это мой первый вопрос, поэтому, пожалуйста, будьте добры, если он был задан неправильно.

1 Ответ

0 голосов
/ 05 марта 2020

Я предлагаю вам преобразовать ваши данные в "аккуратный" формат. Подробнее см. this . Но для вашей конкретной проблемы c попробуйте что-то вроде этого:

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(tidyr)

n <- 10
set.seed(123)
df <- tibble(id=1:n
             ,field1=sample(c(1:5,NA),n,replace = T)
             ,field2=sample(c(1:5,NA),n,replace = T)
             ,field3=sample(c(1:5,NA),n,replace = T)
             ,field4=sample(c(1:5,NA),n,replace = T)
             )
df
#> # A tibble: 10 x 5
#>       id field1 field2 field3 field4
#>    <int>  <int>  <int>  <int>  <int>
#>  1     1      3     NA      1      1
#>  2     2     NA      1      5      3
#>  3     3      3      2      3      5
#>  4     4      2      3      2      4
#>  5     5      2      5      2      2
#>  6     6     NA      3      1      5
#>  7     7      3      3     NA      1
#>  8     8      5      1      3      1
#>  9     9      4      4      4      2
#> 10    10     NA      1     NA      3
df %>% 
  gather('field','value',-id) %>% 
  arrange(id) %>% 
  filter(is.na(value))
#> # A tibble: 6 x 3
#>      id field  value
#>   <int> <chr>  <int>
#> 1     1 field2    NA
#> 2     2 field1    NA
#> 3     6 field1    NA
#> 4     7 field3    NA
#> 5    10 field1    NA
#> 6    10 field3    NA

Создано в 2020-03-05 пакетом prex (v0.3.0)

...