R: Feed специфицирует c строку, чтобы функционировать в операторе ifelse - PullRequest
0 голосов
/ 09 апреля 2020

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

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

Например:


test_function=function(value){
   print(value)
   return(value)}

testdf<-data.frame(a=c(1,1,2,2,3,3),b=c(1,2,3,4,5,6))

testdf$c<-ifelse(testdf$a==2,test_function(testdf$b),NA)

Этот пример дает ответ, который я хотел бы ожидаем (testdf $ c = NA, NA, 3,4, NA, NA), однако оператор print показывает, что по пути весь столбец a передается в test_function ().

В моих реальных данных это приводит к сбою (извините, я действительно изо всех сил стараюсь привести воспроизводимый пример).

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

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

Заранее спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

Вы можете получить индекс где a = 2 и передать его test_function.

inds <- testdf$a == 2
testdf$c <- NA
testdf$c[inds] <- test_function(testdf$b[inds])

Это печатает в консоли:

#[1] 3 4

и testdf это:

testdf
#  a b  c
#1 1 1 NA
#2 1 2 NA
#3 2 3  3
#4 2 4  4
#5 3 5 NA
#6 3 6 NA
0 голосов
/ 09 апреля 2020

Если вы хотите получить результаты функции в ifelse, сохраните вывод и передайте его функции. В противном случае используйте и if{}else{} конструирование внутри функции.

x <- test_function(testdf$b)
[1] 1 2 3 4 5 6
testdf$c <- ifelse(testdf$a==2, x, NA)
testdf$c
[1] NA NA  3  4 NA NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...