Поместите подкадр данных, сопоставив его со списком, и включите также несоответствующее значение в вывод, используя R - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть фрейм данных (myDF), который имеет 2 столбца «A» и «B» и функцию (myfunc), которая принимает список в качестве входных данных, и если он находит совпадение в столбце «A», то он возвращает новый фрейм данных, который является подмножеством myDF, содержащим совпадение значения и соответствующий столбец «B».

Но я хочу, чтобы функция также возвращала несоответствующее значение в столбце A и строку NULL в столбце B.

myDF:

A  B
1 11
2 22
3 33

myfunc:

myfunc <- function(x) {
  r<- with(myDF, myDF[a %in% x, c("a", "b")])
  return(data.frame(r))
}

Ввод: mylist = c(1,2,"E")

Ожидаемый результат:

A      B
1     11
2     22
E   NULL

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

Это операция соединения, которую можно выполнить в базе R с помощью merge, если вы сначала сделаете список data.frame. Аргумент all.y = T включает строки mylistDF без соответствующих строк в myDF в выходных данных.

mylistDF <- data.frame(A = mylist, stringsAsFactors = F)

merge(myDF, mylistDF, by = 'A', all.y = T)

#   A  B
# 1 1 11
# 2 2 22
# 3 E NA

Поскольку вы пометили tidyr, вот решение tidyverse (тот же вывод)

library(tidyverse)

mylistDF <- tibble(A = mylist)

myDF %>% 
  mutate_at('A', as.character) %>% 
  right_join(mylistDF, by = 'A')
0 голосов
/ 03 ноября 2018

Создаем логический индекс и присваиваем

i1 <- with(myDF, !A %in% mylist)
myDF$B[i1] <- "NULL"
myDF$A[i1] <- mylist[i1]
myDF
#  A    B
#1 1   11
#2 2   22
#3 E NULL

Примечание. Присвоение символьной строки столбцу «B» эффективно изменяет тип с numeric на character. Лучшим вариантом было бы присвоить его NA

myDF$B[i1] <- NA

Или

data.frame(A= mylist, B = myDF$B[match(mylist, myDF$A)])
...