我有以下问题,关于如何使用另一个数据帧将值插入for循环中的for循环对数据帧进行子集化。
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个ID的数据框,它已完成了一个调查,其中的问题分支于先前的问题。我想创建一个ID列表的子集数据框,该ID列表没有回答每个调查问题,但是如果调查受访者应该看到该问题,我只希望将NA实例包括在列表中。
以下代码可以很好地写入与NA的每个实例的ID和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个问题进行调查。我可以做一个for循环或函数吗?
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循环了解不多,我知道这是错误的,但这就是我的想法。
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
在这种情况下,我不知道该如何处理某些问题从其他分支中分离出来的情况。
这是我的第一个问题,因此,如果提出的问题不正确,请保持友好。
答案 0 :(得分:0)
我建议您将数据转换为“整洁”格式,有关更多详细信息,请参见this。但是对于您的特定问题,请尝试以下操作:
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
由reprex package(v0.3.0)于2020-03-05创建