用 dplyr 比较两个字符列的内容

Sim*_*mon 7 r dplyr

我试图比较一列的内容与另一列的内容是否相等或不同。

Response <- c("Old", "New", "Old", "New")
Correct_answer <- c("New", "Old", "Old", "New")
comparison <- data.frame(Response, Correct_answer)
Run Code Online (Sandbox Code Playgroud)

我试过这个:

mutate(comparison, Resp_final = ifelse(grepl("Old", Response), "1",
                                  ifelse(grepl("New", Response), "2", "")))
Run Code Online (Sandbox Code Playgroud)

但它只检查“响应”列。如何比较“Response”和“Correct_answer”列并使用 dplyr 在一列中获得结果?

谢谢!

yee*_*dle 11

如果您唯一关心的是平等,那么一个简单的方法if_else就可以做到:

comparison %>% mutate(Resp_final = if_else(Response == Correct_answer, 1, 0))
Run Code Online (Sandbox Code Playgroud)

但是,如果您不仅要比较它们是否相等,还要比较它们如何相等,您可以这样做case_when

comparison %>% 
  mutate(Resp_final = case_when(
   Response == Correct_answer & Response == "Old" ~ "1",
   Response == Correct_answer & Response == "New" ~ "2",
   TRUE                                           ~ ""))
Run Code Online (Sandbox Code Playgroud)

输出:

## Response Correct_answer resp_final
## 1        Old            New           
## 2        New            Old           
## 3        Old            Old          1
## 4        New            New          2
Run Code Online (Sandbox Code Playgroud)


小智 2

如果要比较的列是具有不同级别数的因素,您可能需要先将它们转换为字符,否则会引发错误。

显示错误是如何发生的:

fruits1 <- as.factor(c("grape", "lemon", "watermelon",
 "apple", "banana","avocado", "lemon","watermelon"))

fruits2 <- as.factor(c("lemon", "grape", "orange",
"apple", "grape","avocado","lemon","grape"))

df <- data.frame(fruits1, fruits2)

#Comparing:

df %>% 
  mutate(comparison = if_else(
    fruits1 == fruits2, "equal", "different"))

#Throws an error
Run Code Online (Sandbox Code Playgroud)

将其固定在管道内:

df %>% 
  mutate(comparison = if_else(
   as.character(fruits1) == as.character(fruits2), "equal", "different"))
Run Code Online (Sandbox Code Playgroud)