Если L oop с несколькими условиями - PullRequest
0 голосов
/ 03 февраля 2020

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

df1
Name      Ch1      Val1
A          a         x1
B          b         x2
C          a         x3
...

И я хочу добавить еще одну строку, которая дает мне решение для l oop Я пытаюсь получить:

for (i in nrow(df))
  if ( (df[i,3]>=-2)==T & (df3[i,3] <=2)==T & df[i,2]=="a"){
    df[i,4]<-TRUE
  }else if ((df[i,3]>2)==T & df[i,2]=="b"){
    df[i,4]<-TRUE
  }else (df[i,4]<-FALSE)

Таким образом, в основном, если значение в Val1 находится в интервале от -2 до +2, а Ch1 равен «a», это должно дать ИСТИНА, если Val1 больше 2, а Ch1 равно «b», то результат равен TRUE

В противном случае оно всегда должно быть ложным.

Мой l oop, кажется, возвращает результат только для первой строки, остальное - NA. Есть идеи, где ошибка? Или другой способ решить эту проблему (хотя у меня на самом деле есть еще несколько операционных)

Спасибо!

Ответы [ 2 ]

2 голосов
/ 03 февраля 2020

Если я правильно понимаю, вы пытаетесь создать новый столбец, который содержит true или false. Я бы использовал dplyr для этого.

df <- df %>% 
   mutate(new_column = case_when(
 Val1 >=-2  & Val1 <=2 & Ch1 =="a" ~ TRUE,
Val1 > 2 & Ch1 == "b" ~ TRUE,
TRUE ~ FALSE
))
1 голос
/ 04 февраля 2020

Ваш for l oop выполняет только одну итерацию, поскольку ему передается одно значение вместо последовательности: i принимает только одно указанное вами значение, а не каждое значение в последовательности, например, каждое число из От 1 до nrow (df).

Например:

df <- data.frame(a = 1:5)
for (i in nrow(df)) {
print(i)
}

приводит к: 5

, но

for (i in 1:nrow(df)) {
print(i)
}

приводит к: 1 2 3 4 5

но ответ @ a nnet более элегантен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...