如何使用逻辑语句添加新列

时间:2019-06-26 02:50:00

标签: r

我想创建一个名为“另一种语言”的新列,该列为我提供0/1的值。我希望实现的逻辑是,如果Q1Q4_1,Q1Q4_2,Q1Q4_3或Q1Q4_4 = N / A,则为0;如果Q1Q4_1,Q1Q4_2,Q1Q4_3或Q1Q4_4包含“英语”以外的字符,其中Q1Q4_1,Q1Q4_2,Q1Q4_3或OR Q1Q4_4是数据集中的其他列,则返回1。

full_quiz = read.csv("Project Data/Full_Quiz_Dataset.csv")    
full_quiz$another_language = c(full_quiz$Q1Q4_1,full_quiz$Q1Q4_2, full_quiz$Q1Q4_3,full_quiz$Q1Q4_4) != NA

我知道这是不对的,但是我需要一些帮助!

1 个答案:

答案 0 :(得分:0)

这是一种应该推广到您的数据的方法。它至少让您对逻辑语法有所了解。我创建了一个简单的数据框,希望可以涵盖这里的所有情况(例如,仅英语;英语和另一种语言;英语以外的语言; NA;等等):

library(tidyverse)

df <- structure(list(col1 = structure(c(3L, 4L, 3L, 1L, 2L, 1L), .Label = 
c("English", 
"Japanese", "Mandarin", "N/A"), class = "factor"), col2 = structure(c(4L, 
3L, 1L, 2L, NA, NA), .Label = c("Japanese", "Latin", "N/A", "Taiwanese"
), class = "factor"), col3 = structure(c(1L, 2L, 2L, NA, NA, 
NA), .Label = c("Japanese", "N/A"), class = "factor"), col4 = structure(c(2L, 
NA, NA, 1L, NA, NA), .Label = c("N/A", "Polish"), class = "factor")), class = 
"data.frame", row.names = c(NA, 
-6L))


      col1      col2     col3   col4
1 Mandarin Taiwanese Japanese Polish
2      N/A       N/A      N/A   <NA>
3 Mandarin  Japanese      N/A   <NA>
4  English     Latin     <NA>    N/A
5 Japanese      <NA>     <NA>   <NA>
6  English      <NA>     <NA>   <NA>

在删除的数据的原始图片中,您有一些N/A值是字符串(而不是NA)。首先是将它们全部转换为真实的NA值:

df[df=="N/A"] <- NA
df[df=="n/a"] <- NA
df[df=="NA"] <- NA
df[df=="na"] <- NA

然后我们可以将mutateifelse语句一起使用:

df %>% mutate(another_language = ifelse((df$col1 != "English" & !is.na(df$col1))
| (df$col2 != "English" & !is.na(df$col2)) 
| (df$col3 != "English" & !is.na(df$col3)) 
| (df$col4 != "English" & !is.na(df$col4)),
1,
0))

|是元素级逻辑OR运算符,而&是相应的AND运算符。如果满足条件,则df$another_language填充1,如果不满足条件,则0填充。逻辑应该可读。输出如下:

      col1      col2     col3   col4 another_language
1 Mandarin Taiwanese Japanese Polish                1
2     <NA>      <NA>     <NA>   <NA>                0
3 Mandarin  Japanese     <NA>   <NA>                1
4  English     Latin     <NA>   <NA>                1
5 Japanese      <NA>     <NA>   <NA>                1
6  English      <NA>     <NA>   <NA>                0