#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
- Зацикливайтесь на столбцах «indx1», «indx2 «» df » в
Map
- Извлеките соответствующие столбцы «df1» —
df1[[x]]
,df1[[y]]
- Создайте множественное логическое выражение с
>
помощью иamp;
- Проверьте, есть ли
any
TRUE
значение из строк «df1» - Принудить к бинарному (
(
— или использоватьas.integer
) - Преобразуйте
list
выходные данные в avector
—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