Используйте таблицу данных для маскировки / фильтрации другой таблицы данных в R - PullRequest
3 голосов
/ 29 апреля 2019

У меня есть таблица данных, A, как:

year          location    sigma_NN_1 sigma_NN_2 sigma_NN_3
2076 43.59375_-116.78125  1.4681173   1.664289   1.735974
2077 43.59375_-116.78125  1.3798515   1.550524   1.551269
2078 43.59375_-116.78125  0.7934367   1.064248   1.177981
2079 43.59375_-116.78125  1.8235574   1.991018   2.288402
2080 43.59375_-116.78125  2.5560329   2.578093   2.589334

И я хочу использовать его для маскировки другой таблицы данных, в которой значение сигма ниже порогового значения, скажем, 2. Допустим, моя вторая таблица данных B

year            location       location_NN_1      location_NN_2      location_NN_3
2076 43.59375_-116.78125  41.15625_-90.65625 41.21875_-90.65625 41.15625_-90.65625
2077 43.59375_-116.78125  43.34375_-78.15625 43.34375_-78.21875 43.28125_-78.15625
2078 43.59375_-116.78125  41.34375_-90.78125 41.21875_-90.65625 41.53125_-73.96875
2079 43.59375_-116.78125 43.53125_-116.78125 41.34375_-90.78125 41.71875_-74.15625
2080 43.59375_-116.78125  41.34375_-90.78125 41.96875_-86.21875 41.21875_-90.65625

Итак, я хочу иметь что-то вроде B[A<2], но, очевидно, это не работает, иначе я бы не был здесь.

Есть предложения?

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

выход

year            location       location_NN_1      location_NN_2      location_NN_3
2076 43.59375_-116.78125  41.15625_-90.65625 41.21875_-90.65625 41.15625_-90.65625
2077 43.59375_-116.78125  43.34375_-78.15625 43.34375_-78.21875 43.28125_-78.15625
2078 43.59375_-116.78125  41.34375_-90.78125 41.21875_-90.65625 41.53125_-73.96875
2079 43.59375_-116.78125 43.53125_-116.78125 41.34375_-90.78125                 NA
2080 43.59375_-116.78125                  NA                 NA                 NA

Цель состоит в том, чтобы найти местоположения, чья соответствующая сигма в таблице данных A меньше 2.

Ответы [ 3 ]

4 голосов
/ 29 апреля 2019

Мы можем использовать базовое подмножество R для определения соответствующих ячеек B и замены их на NA.Этот подход требует, чтобы порядок столбцов в A и B был одинаковым.

Мы можем использовать простое условное выражение для dfa, чтобы найти ячейки со значением сигмы не менее 2Так как мы не хотим применять условное выражение к столбцам года и условия, мы поднастроим их перед применением условного выражения:

!(dfa[-c(1,2)] < 2)
     sigma_NN_1 sigma_NN_2 sigma_NN_3
[1,]      FALSE      FALSE      FALSE
[2,]      FALSE      FALSE      FALSE
[3,]      FALSE      FALSE      FALSE
[4,]      FALSE      FALSE       TRUE
[5,]       TRUE       TRUE       TRUE

Это возвращает логическую матрицу, которую мы можем использовать для поднабора B взаменить значения.Здесь происходит подмножество B дважды: сначала мы игнорируем столбцы года и местоположения, чтобы получить только столбцы местоположения, затем используем более раннее условное выражение, чтобы выбрать строки, в которых совпадающее сигма-значение не меньше 2, и вставляем NA в это:

dfb[-c(1,2)][!(dfa[-c(1,2)] < 2)] <- NA
dfb

  year            location       location_NN_1      location_NN_2      location_NN_3
1 2076 43.59375_-116.78125  41.15625_-90.65625 41.21875_-90.65625 41.15625_-90.65625
2 2077 43.59375_-116.78125  43.34375_-78.15625 43.34375_-78.21875 43.28125_-78.15625
3 2078 43.59375_-116.78125  41.34375_-90.78125 41.21875_-90.65625 41.53125_-73.96875
4 2079 43.59375_-116.78125 43.53125_-116.78125 41.34375_-90.78125               <NA>
5 2080 43.59375_-116.78125                <NA>               <NA>               <NA>
3 голосов
/ 29 апреля 2019

Простое базовое решение R:

B[-(1:2)][A[-(1:2)]>=2] <- NA

Выбрать все столбцы, кроме первого и второго B[-(1:2)].

Затем используйте векторизованное логическое выражение A[-(1:2)]>=2, чтобы установить для правильных элементов значение NA.

Результаты:

  year            location       location_NN_1      location_NN_2      location_NN_3
1 2076 43.59375_-116.78125  41.15625_-90.65625 41.21875_-90.65625 41.15625_-90.65625
2 2077 43.59375_-116.78125  43.34375_-78.15625 43.34375_-78.21875 43.28125_-78.15625
3 2078 43.59375_-116.78125  41.34375_-90.78125 41.21875_-90.65625 41.53125_-73.96875
4 2079 43.59375_-116.78125 43.53125_-116.78125 41.34375_-90.78125               <NA>
5 2080 43.59375_-116.78125                <NA>               <NA>               <NA>
3 голосов
/ 29 апреля 2019

Предполагая, что эти data.table объекты, и предполагая, что строки столбцов 'sigma' в 'A' должны быть все меньше, чем порог 2.

library(data.table)
nm1 <- grep("sigma", names(A), value = TRUE)
i1 <- setDT(A)[, Reduce(`&`, lapply(.SD, `<`, 2)), .SDcols = nm1]
setDT(B)[i1] 

Обновление

На основании ожидаемой выработки

nm2 <- grep("sigma", names(A))
B[, (nm2) := Map(function(x, y) replace(x, y >= 2, NA_character_),
        .SD, A[, nm2, with = FALSE]), .SDcols = nm2][]
# year            location       location_NN_1      location_NN_2      location_NN_3
#1: 2076 43.59375_-116.78125  41.15625_-90.65625 41.21875_-90.65625 41.15625_-90.65625
#2: 2077 43.59375_-116.78125  43.34375_-78.15625 43.34375_-78.21875 43.28125_-78.15625
#3: 2078 43.59375_-116.78125  41.34375_-90.78125 41.21875_-90.65625 41.53125_-73.96875
#4: 2079 43.59375_-116.78125 43.53125_-116.78125 41.34375_-90.78125               <NA>
#5: 2080 43.59375_-116.78125                <NA>               <NA>               <NA>

Данные

A <- structure(list(year = 2076:2080, location = c("43.59375_-116.78125", 
"43.59375_-116.78125", "43.59375_-116.78125", "43.59375_-116.78125", 
"43.59375_-116.78125"), sigma_NN_1 = c(1.4681173, 1.3798515, 
0.7934367, 1.8235574, 2.5560329), sigma_NN_2 = c(1.664289, 1.550524, 
1.064248, 1.991018, 2.578093), sigma_NN_3 = c(1.735974, 1.551269, 
1.177981, 2.288402, 2.589334)), class = "data.frame", row.names = c(NA, 
-5L))

B <- structure(list(year = 2076:2080, location = c("43.59375_-116.78125", 
"43.59375_-116.78125", "43.59375_-116.78125", "43.59375_-116.78125", 
"43.59375_-116.78125"), location_NN_1 = c("41.15625_-90.65625", 
"43.34375_-78.15625", "41.34375_-90.78125", "43.53125_-116.78125", 
"41.34375_-90.78125"), location_NN_2 = c("41.21875_-90.65625", 
"43.34375_-78.21875", "41.21875_-90.65625", "41.34375_-90.78125", 
"41.96875_-86.21875"), location_NN_3 = c("41.15625_-90.65625", 
"43.28125_-78.15625", "41.53125_-73.96875", "41.71875_-74.15625", 
"41.21875_-90.65625")), class = "data.frame", row.names = c(NA, 
-5L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...