我想创建一个名为“另一种语言”的新列,该列为我提供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
我知道这是不对的,但是我需要一些帮助!
答案 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
然后我们可以将mutate
与ifelse
语句一起使用:
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