Условный поиск, сопоставление, фильтрация и замена значений между фреймами данных - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть два кадра данных, как показано ниже.Я хотел бы заменить значения (ячейки) в кадре данных 1 на NA, если соответствующее значение в кадре данных 2 ниже (или выше) порогового значения, например, <= 0,05.Я попытался привести простой пример ниже.У меня ограниченный опыт работы с R, но я не могу сразу найти легкое решение.Любая помощь / предложения будут высоко оценены. </p>

input_1 = data.frame(col1 = c("ex1", "ex2", "ex3", "ex4"), col2 = c(1.2, 1.6, 1.9, 0.8), col3 = c(2.1, 0.8, 2.8, 1.9))

input_2 = data.frame(col1 = c("ex1", "ex2", "ex3", "ex4"), col2 = c(0.07, 0.06, 0.05, 0.03), col3 = c(0.05, 0.06, 0.08, 0.07))

output = data.frame(col1 = c("ex1", "ex2", "ex3", "ex4"), col2 = c(NA, NA, 1.9, 0.8), col3 = c(2.1, NA, NA, NA))

Ответы [ 4 ]

1 голос
/ 01 апреля 2019

Используя только индексирование с помощью базы R, это можно сделать одной строкой, как показано ниже. Перед этим я рекомендую использовать stringsAsFactors = F внутри функции data.frame, это также хорошая практика для будущего чтения данных в R.

input_1[-1][input_2[-1] > 0.05] = NA

Он меняет input_1 на месте, но если вы хотите сохранить оригинал как есть, то вы можете заранее создать другой объект. [-1] исключает первый столбец.

1 голос
/ 01 апреля 2019

Самое короткое и простое решение, которое я могу придумать для вашей конкретной проблемы, - это использовать функцию which().Решение:

output[which(input_2$col2 > 0.05),2] <- NA
output[which(input_2$col3 > 0.05),3] <- NA

Функция which() находит значения индексов TRUE в логическом векторе или массиве.Путем логической настройки столбца (input_2$col2) для значения R проверяет эту гипотезу на всех значениях в векторе и возвращает вектор TRUE или FALSE для каждого значения в векторе.Когда вы комбинируете это с функцией which() и используете в подмножестве вектора или столбца / строки в кадре данных, вы получите значения из этого вектора / столбца / строки, которые соответствуют вашему логическому тесту.Это простой способ установить условные значения в кадре данных.

Однако, если у вас есть только один порог на столбец, тогда вы можете использовать функцию ifelse() внутри функции mutate(), которую вы передаете на канал данных.,Вот пример:

threshold <- 0.5
df <- input_1 %>% 
  mutate(new_col = ifelse(col2 > threshold, NA, col2))

Надеюсь, это поможет.Если вам интересно узнать R, прочитайте книгу Хэдли Уикхема здесь: https://r4ds.had.co.nz/index.html

0 голосов
/ 01 апреля 2019
output = input_1
output[input_2[,"col2"] > 0.05 , "col2"] = NA
output[input_2[,"col3"] > 0.05 , "col3"] = NA

> output
  col1 col2 col3
1  ex1   NA  2.1
2  ex2   NA   NA
3  ex3  1.9   NA
4  ex4  0.8   NA
0 голосов
/ 01 апреля 2019

Подход Base R, не очень эффективный

dt <- merge(input_1, input_2, by = 'col1', suffixes = c('_1', '_2'))
dt$col2_1[dt$col2_2 <= 0.05] <- NA
dt$col3_1[dt$col3_2 <= 0.05] <- NA

dt$col2_2 <- NULL
dt$col3_2 <- NULL

  col1 col2_1 col3_1
1  ex1    1.2     NA
2  ex2    1.6    0.8
3  ex3     NA    2.8
4  ex4     NA    1.9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...