Заменить цикл на применить функцию - PullRequest
3 голосов
/ 21 сентября 2019

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

Создание двух фреймов данных:

df1 <- data.frame(c("A","C","E","F"),
                  c(17,24,5,8))
names(df1)[1] <- "Apple"
names(df1)[2] <- "Orange"
df1$Apple <- as.character(df1$Apple)

df1$Banana <- 0

df2 <- data.frame(c("Q","A","C","E"),
                  c(8,303,24,17))
names(df2)[1] <- "Tomato"
names(df2)[2] <- "Cucumber"
df2$Tomato <- as.character(df2$Tomato)

Единственным наблюдением, существующим в обоих фреймах данных, является "C", 24, который находится в строке 2 df1 и строке 3 df2.Я могу извлечь эту информацию, используя цикл for, создавая подмножество с переменной эквивалентностью для первой переменной и проверяя, существует ли идентичное значение для 2-й переменной в наборе данных:

for(idx in 1:4){
df3 <- subset(df2, Tomato == df1$Apple[idx])
df1$Banana[idx] <- df1$Orange[idx] %in% df3$Cucumber
}

, что приводит кжелаемый результат:

> df1
  Apple Orange Banana
1     A     17      0
2     C     24      1
3     E      5      0
4     F      8      0

Однако я не могу достичь того же результата с помощью функции применения:

Banana <- function(){
  df3 <- subset(df2, Tomato == df1$Apple)
  df1$Orange %in% df3$Cucumber
}

apply(X = df1, MARGIN = 1, FUN = Banana)

Вместо этого я получаю следующее сообщение об ошибке:

Ошибка в FUN (newX [, i], ...): неиспользованный аргумент (newX [, i])

Кто-нибудь знает, что я здесь не так делаюи как правильно использовать функцию?

1 Ответ

1 голос
/ 21 сентября 2019

Одним из способов использования apply является итерация по df1 по строкам и проверка, равняется ли для какой-либо строки первое значение Tomato, а второе - Cucumber, и присвоение целочисленного значения соответственно.

df1$Banana <- as.integer(apply(df1, 1, function(x) 
                 any(x[1] == df2$Tomato & x[2] == df2$Cucumber)))
df1
#  Apple Orange Banana
#1     A     17      0
#2     C     24      1
#3     E      5      0
#4     F      8      0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...