У меня есть две колонки под названием Apple и Pear. Если текст в этих столбцах говорит «Да» или «Нет», я хочу, чтобы этот текст был заменен именем столбца. Желаемый результат показан в полях Apple2 и Pear2 в примере.
Apple<-c("Yes","No", "Yes", "Other", NA)
Pear<-c("Yes",NA, "No", "Other","Yes")
Apple2<-c("Apple","Apple","Apple","Other",NA)
Pear2<-c("Pear",NA,"Pear","Other","Pear")
data<-data.frame(Apple,Pear,Apple2,Pear2, stringsAsFactors = FALSE)
Может ли кто-нибудь предложить способ достижения этого?





С dplyr, across это можно сделать, получив имя столбца, то есть cur_column() с условным выражением в ifelse/case_when
library(dplyr)
data <- data %>%
mutate(across(c(Apple, Pear),
~ case_when(.x %in% c("Yes", "No") ~ cur_column(), TRUE ~ .x)))
-выход
data
Apple Pear Apple2 Pear2
1 Apple Pear Apple Pear
2 Apple <NA> Apple <NA>
3 Apple Pear Apple Pear
4 Other Other Other Other
5 <NA> Pear <NA> Pear
Мой ответ концептуально такой же, как у @akrun. Отличие в том, что я предполагаю, что ваш ввод data имеет только два столбца. Поэтому в вашем across вам нужно использовать .names для установки имен столбцов вновь созданных. Также нам нужно указать, что делать, если .x == "Others" в case_when.
library(dplyr)
Apple<-c("Yes","No", "Yes", "Other", NA)
Pear<-c("Yes",NA, "No", "Other","Yes")
data<-data.frame(Apple,Pear)
data %>%
mutate(across(everything(),
~case_when(.x == "Other" ~ "Other",
.x %in% c("Yes", "No") ~ cur_column(),
TRUE ~ NA_character_),
.names = "{.col}2"))
Apple Pear Apple2 Pear2
1 Yes Yes Apple Pear
2 No <NA> Apple <NA>
3 Yes No Apple Pear
4 Other Other Other Other
5 <NA> Yes <NA> Pear
Вот еще один вариант использования imap_dfr из purrr:
library(tidyverse)
imap_dfr(data, ~ replace(.x, .x %in% c("Yes", "No"), .y))
Выход
Apple Pear Apple2 Pear2
<chr> <chr> <chr> <chr>
1 Apple Pear Apple Pear
2 Apple NA Apple NA
3 Apple Pear Apple Pear
4 Other Other Other Other
5 NA Pear NA Pear
Или другой вариант с использованием transmute:
data %>%
transmute(across(everything(), ~ ifelse(
.x %in% c("Yes", "No"), deparse(substitute(.)), .
)))
Данные
data <- structure(list(Apple = c("Yes", "No", "Yes", "Other", NA), Pear = c("Yes",
NA, "No", "Other", "Yes"), Apple2 = c("Apple", "Apple", "Apple",
"Other", NA), Pear2 = c("Pear", NA, "Pear", "Other", "Pear")), class = "data.frame", row.names = c(NA,
-5L))