R语言 对空字符串使用case_when

1cosmwyk  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(93)

我有一个数据集,孩子们被问到他们在家里是只说德语,德语和另一种语言,还是只说另一种语言。然后他们被问到他们在家里说哪种语言(例如,英语,0 -否; 1 =是)。还有一个字段,他们可以输入其他语言。这被保存为一个字符变量。因为有错误,因为儿童输入“只有德国”然后是其他语言,我想创建一个新的变量“mig_1”,它在最后区分有移民背景和没有移民背景的孩子(0 =德语,1 =有移民背景)。
下面是一个简短的示例(并不是所有不同语言的变量都包括在内):

kommschreib <- data.frame (code = c("013101", "013102", "013205", "114113", "014201", "053216"), mig = c(0, NA, 1, 2, 1, 0), englisch = c(0, 1, 1, 0, 0), sprache=c("niederländisch", "italienisch"))

字符串
使用我的代码,我已经可以涵盖他们在第一个问题中没有指定任何内容的情况(德语,德语和另一种语言,只是另一种语言),但随后标记了另一种语言。我已经涵盖了他们表示“仅限德语”,但随后勾选另一种语言的情况。我还涵盖了“正常”情况(儿童仅表示德语,没有其他语言或儿童表示德语和其他语言/仅表示另一种语言)。

kommschreib <- kommschreib %>%
  mutate(mig_2 = case_when(englisch == 1 | arabisch == 1 | kurdisch == 1 | russisch == 1 | ukrainisch == 1 | farsi == 1 | polnisch == 1 | türkisch == 1 | albanisch == 1 ~ 1,
                           mig == 0 & englisch == 1 ~ 1,
                           mig == 0 & arabisch == 1 ~ 1,
                           mig == 0 & kurdisch == 1 ~ 1,
                           mig == 0 & russisch == 1 ~ 1,
                           mig == 0 & ukrainisch == 1 ~ 1,
                           mig == 0 & farsi == 1 ~ 1,
                           mig == 0 & polnisch == 1 ~ 1,
                           mig == 0 & türkisch == 1 ~ 1,
                           mig == 0 & albanisch == 1 ~ 1,
                           mig == 0 ~ 0,
                           mig > 0 ~ 1) %>%
           labelled(label = "Migrationshintergrund"))
kommschreib <- kommschreib %>% sjlabelled::set_labels(mig_2, labels = c("dt" = 0, "mig" = 1))


但是我仍然需要输入“German only”或者什么都不输入的情况,但是输入了另一种语言。我想为这种情况输入一个代码:mig == 0(所以只指定了德语)或者mig == NA AND language不为空。
我希望我能解释我的意思。

oalqel3c

oalqel3c1#

假设你的数组是:

kommschreib <- data.frame(code = c("013101", "013102", "013205", "114113", "014201", "053216"), 
                            mig = c(0, NA, 1, 2, 1, 0), 
                            englisch = c(0, 0, 1, 0, 0, 1),
                            arabisch = c(1, 0, 0, 0, 1, 0),
                            kurdisch = c(0, NA, NA, 0, 1, 0))

字符串
如果我理解正确,你可以这样做:

kommschreib1 = kommschreib %>%
                    rowwise() %>% 
                    mutate(mig2 = ifelse(mig %in% c(1, 2) | any(c_across(englisch:kurdisch) %in% 1), 
                                         1, 0))


如果孩子说“德语和另一种语言”,“家里只有另一种语言”,或者如果至少检查了一种其他语言,则返回1(否则为0)。

yws3nbqq

yws3nbqq2#

万岁!终于成功了。
所以,我必须转换所有这些情况下,孩子们没有输入另一种语言NA(我的字符变量称为“s12”):

kommschreib <- kommschreib %>% mutate_if(is.character, list(~na_if(., "")))

字符串
然后我可以添加我以前的代码(注意顺序)。所以,我最终得到了这段代码,其中所有的选项都应该被考虑:

kommschreib <- kommschreib %>%
  mutate(mig_2 = case_when(mig == 0 & !is.na(s12) ~ 1,
                           is.na(mig) & !is.na(s12) ~ 1,
                           englisch == 1 | arabisch == 1 | kurdisch == 1 | russisch == 1 | ukrainisch == 1 | farsi == 1 | polnisch==1 | türkisch==1 | albanisch==1 ~ 1,
                           mig == 0 & englisch == 1 ~ 1,
                           mig == 0 & arabisch == 1 ~ 1,
                           mig == 0 & kurdisch == 1 ~ 1,
                           mig == 0 & russisch == 1 ~ 1,
                           mig == 0 & ukrainisch == 1 ~ 1,
                           mig == 0 & farsi == 1 ~ 1,
                           mig == 0 & polnisch == 1 ~ 1,
                           mig == 0 & türkisch == 1 ~ 1,
                           mig == 0 & albanisch == 1 ~ 1,
                           mig == 0 ~ 0,
                           mig > 0 ~ 1) %>%
           labelled(label = "Migration background"))


它似乎有点复杂,我真的希望我没有错过什么。我检查了它是否做了它应该做的(到目前为止它做到了!)。

相关问题