Проверьте, присутствуют ли столбцы одного фрейма данных в другом фрейме данных с ненулевым элементом в R

#r

Вопрос:

Я хочу проверить, присутствуют ли столбцы одного фрейма данных в другом фрейме данных, и значения этих столбцов во втором фрейме данных должны быть ненулевыми. Например,

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

 indx1   indx2
aa 1     ac
ac       tg 0
 

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

 col1    aa 1    ab 2    ac  bd 5    tg 0
A        1       0       0    1      4
B        0       0       1    1      0
C        1       1       0    1      1
D        0       0       0    5      5
E        0       0       1    0      9
 

Я хочу проверить, может ли какая-либо из строк df удовлетворять критериям: df1[i,1]>0 и df1[i,2]>0 . i переходит от 1 к nrow(df1) . Например:

когда i = 1 я хочу проверить , может ли какой-либо из строк df удовлетворять условию: aa > 0 amp; ac > 0 . Так как ни одна из строк не удовлетворяет условию, код вернется 0 . когда i = 2 , условие будет следующим: ac > 0 amp; tg > 0 . здесь одна строка df (5-я строка) удовлетворяет условию, поэтому код вернется 1 . Выходные данные будут сохранены в новом столбце df1 . Результат будет следующим:

 indx1   indx2   count_occ
aa 1    ac       0
ac      tg 0     1
 

Я попытался сделать следующее:

 for(i in 1:nrow(df1)){
    d1 = subset(df, as.name(df1[i,1]) > 0 amp; as.name(df1[i,2]) > 0)
    if(nrow(d1) >= 1){
      df1[i,3] = 1
    }else{
      df1[i,3] = 0
    }
  }
 

Но d1 = subset(df, as.name(df1[i,1]) > 0 amp; as.name(df1[i,2]) > 0) это не дает мне правильного вывода. Любая помощь будет высоко оценена. ТИА.

Ответ №1:

Мы можем использовать Map

  1. Зацикливайтесь на столбцах «indx1», «indx2 «» df » в Map
  2. Извлеките соответствующие столбцы «df1» — df1[[x]] , df1[[y]]
  3. Создайте множественное логическое выражение с > помощью и amp;
  4. Проверьте, есть ли any TRUE значение из строк «df1»
  5. Принудить к бинарному ( ( — или использовать as.integer )
  6. Преобразуйте list выходные данные в a vector unlist и назначьте их для создания столбца «count_occ» в «df»
 df$count_occ <- unlist(Map(function(x, y) 
       (any(df1[[x]] > 0 amp; df1[[y]] > 0, na.rm = TRUE)), df$indx1, df$indx2))
 

-выход

 df
  indx1 indx2 count_occ
1  aa 1    ac         0
2    ac  tg 0         1
 

данные

 df <- structure(list(indx1 = c("aa 1", "ac"), indx2 = c("ac", "tg 0"
)), class = "data.frame", row.names = c(NA, -2L))

df1 <- structure(list(col1 = c("A", "B", "C", "D", "E"), `aa 1` = c(1L, 
0L, 1L, 0L, 0L), `ab 2` = c(0L, 0L, 1L, 0L, 0L), ac = c(0L, 1L, 
0L, 0L, 1L), `bd 5` = c(1L, 1L, 1L, 5L, 0L), `tg 0` = c(4L, 0L, 
1L, 5L, 9L)), class = "data.frame", row.names = c(NA, -5L))
 

Комментарии:

1. Спасибо. Это сработало. если мне нужно создать столбец с количеством совпадающих строк df1 для каждой строки df, как я могу изменить код?

2. @user3642360 Вы можете изменить значение any на sum , а затем исключить значения, имеющие 0 для суммы

Ответ №2:

Я думаю, что следующее решение можно использовать с for циклом:

 for(i in 1:nrow(df)) {
  for(j in 1:nrow(df1)) {
    if(df1[j, df[i, 1]] > 0 amp; df1[j, df[i, 2]] > 0) {
      df1[j, "id"] <- 1
    } else {
      df1[j, "id"] <- 0
    }
  }
  if(any(df1$id == 1)) {
    df[i, "count"] <- 1
  } else {
    df[i, "count"] <- 0
  }
}

  indx1 indx2 count
1  aa 1    ac     0
2    ac  tg 0     1