如何使用另一个数据帧中的变量对数据帧进行子集

时间:2020-03-05 05:11:50

标签: r dataframe for-loop iteration subset

我有以下问题,关于如何使用另一个数据帧将值插入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

在这种情况下,我不知道该如何处理某些问题从其他分支中分离出来的情况。

这是我的第一个问题,因此,如果提出的问题不正确,请保持友好。

1 个答案:

答案 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创建