Как вернуть значение ИСТИНА / ЛОЖЬ в зависимости от того, существует ли значение в каких-либо столбцах в R? - PullRequest
2 голосов
/ 04 мая 2020

У меня есть фрейм данных, который выглядит следующим образом:

Fruits1     Fruits2   Fruits3       Apple      Banana       Lemon
N/A         N/A       Apple         N/A        N/A          N/A
Apple       Lemon     N/A           N/A        N/A          N/A
N/A         Banana    Apple         N/A        N/A          N/A

Я хочу выполнить поиск по первым трем столбцам, а затем использовать три последних имени столбца, чтобы вернуть значение ИСТИНА / ЛОЖЬ, когда этот столбец имя появляется в любой строке первых трех столбцов, например:

Fruits1     Fruits2   Fruits3      Apple       Banana       Lemon
N/A         N/A       Apple        TRUE        FALSE        FALSE
Apple       Lemon     N/A          TRUE        FALSE        TRUE
N/A         Banana    Apple        TRUE        TRUE         FALSE

Ответы [ 3 ]

4 голосов
/ 04 мая 2020

В base r вы можете использовать apply, is.element и t следующим образом:

df1[4:6] <- t(apply(df1[1:3], 1, is.element, el = names(df1[4:6])))

#   Fruits1 Fruits2 Fruits3 Apple Banana Lemon
# 1     N/A     N/A   Apple  TRUE  FALSE FALSE
# 2   Apple   Lemon     N/A  TRUE  FALSE  TRUE
# 3     N/A  Banana   Apple  TRUE   TRUE FALSE
1 голос
/ 04 мая 2020

С помощью tidyverse с использованием gather и spread

require(tidyverse)

df <- df %>% 
  select(Fruits1:Fruits3)

df %>% 
  mutate(i = row_number()) %>% 
  gather("key", "fruit", -i) %>% 
  filter(fruit != "N/A") %>% 
  select(-key) %>% 
  mutate(true = T) %>% 
  spread("fruit", "true", fill = F) %>% 
  select(-i) %>% 
  bind_cols(df, .)

это решение будет работать, даже если вы добавите больше фруктов

0 голосов
/ 04 мая 2020

В base R мы можем unlist первых 3 столбцов, создать table с индексом строки rep, проверить, является ли счет больше 0 и присвоить ли его столбцам 4-6.

df1[4:6] <- table(seq_len(nrow(df1))[row(df1[1:3])], unlist(df1[1:3]))[,1:3] > 0
df1
#  Fruits1 Fruits2 Fruits3 Apple Banana Lemon
#1     N/A     N/A   Apple  TRUE  FALSE FALSE
#2   Apple   Lemon     N/A  TRUE  FALSE  TRUE
#3     N/A  Banana   Apple  TRUE   TRUE FALSE

ПРИМЕЧАНИЕ. Пропущенные значения NA указаны в виде символьной строки ("N/A")

ПРИМЕЧАНИЕ 2. Это векторизация, а не циклическая обработка по каждой строке

данные

df1 <- structure(list(Fruits1 = c("N/A", "Apple", "N/A"), Fruits2 = c("N/A", 
"Lemon", "Banana"), Fruits3 = c("Apple", "N/A", "Apple"), Apple = c("N/A", 
"N/A", "N/A"), Banana = c("N/A", "N/A", "N/A"), Lemon = c("N/A", 
"N/A", "N/A")), class = "data.frame", row.names = c(NA, -3L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...