2016-06-29 2 views
0

У меня есть таблица с датами в столбце 1 (столбец «Дата») и значения в столбцах с 2 по 5 (столбцы под заголовком «A» -> "D").R: условное заполнение столбца в таблице на основе ввода из других столбцов


Date A B C D 
1/1/16 12 75 38 88 
1/2/16 32 76 44 34 

т.д.


мне нужно создать дополнительный 6-й столбец Е, который содержит следующее:

Для каждой строки:

Если значение в колонке А> B> C, то значение в колонке E = X

Если значение в колонке А < < B C, то значение в столбце E = Y

для чего другого значения в столбце E = Z

Что такое лучший способ сделать это?

+0

Зачем вам предоставлять данные примера, которые не удовлетворяют ни одному из условий, которые вы особенно хотите проверить? – thelatemail

+0

Извините, я просто хотел привести пример формата таблицы, фактические значения не соответствуют правилам, о которых я упоминал. спасибо, что поймали это! –

ответ

1
# Here I'm simulating your original dataset  
df <- data.frame(Date=seq(Sys.Date(),Sys.Date()+9,by=1), A = seq(1,20,2), 
       B = rep(10,1,1), C=abs(rnorm(10)), D = rnorm(10)) 
# Create E 
df$E <- NA 
df$E[df$A > df$B & df$B > df$C] <- "X" 
df$E[df$A < df$B & df$B < df$C] <- "Y" 
df$E[is.na(df$E)]    <- "Z" 
df 



     Date A B   C    D E 
1 2016-06-29 1 10 0.5833273005 -0.25244803522 Z 
2 2016-06-30 3 10 0.4291374487 0.01669504752 Z 
3 2016-07-01 5 10 1.7079045597 1.28413741595 Z 
4 2016-07-02 7 10 0.2286708311 1.16421926818 Z 
5 2016-07-03 9 10 0.6216853471 1.08934300378 Z 
6 2016-07-04 11 10 1.4662821456 -0.58322427720 X 
7 2016-07-05 13 10 0.8255102263 0.65217873906 X 
8 2016-07-06 15 10 1.6185672627 0.04195996408 X 
9 2016-07-07 17 10 0.6752993011 -2.31746231694 X 
10 2016-07-08 19 10 0.2901133125 0.97969860678 X 

# Create E only for a subset of rows, like 6:10 
df$E <- NA 
df$E[1:5] <- "nothing applied to this row" 
df$E[df$A > df$B & df$B > df$C & 6:10] <- "X" 
df$E[df$A < df$B & df$B < df$C & 6:10] <- "Y" 
df$E[is.na(df$E) & 6:10]    <- "Z" 
df 

     Date A B   C    D       E 
1 2016-06-29 1 10 0.5833273005 -0.25244803522 nothing applied to this row 
2 2016-06-30 3 10 0.4291374487 0.01669504752 nothing applied to this row 
3 2016-07-01 5 10 1.7079045597 1.28413741595 nothing applied to this row 
4 2016-07-02 7 10 0.2286708311 1.16421926818 nothing applied to this row 
5 2016-07-03 9 10 0.6216853471 1.08934300378 nothing applied to this row 
6 2016-07-04 11 10 1.4662821456 -0.58322427720       X 
7 2016-07-05 13 10 0.8255102263 0.65217873906       X 
8 2016-07-06 15 10 1.6185672627 0.04195996408       X 
9 2016-07-07 17 10 0.6752993011 -2.31746231694       X 
10 2016-07-08 19 10 0.2901133125 0.97969860678       X 
+1

Спасибо! Я реализовал это, и он отлично поработал! Как бы я хотел уменьшить количество строк, на которые я хотел бы обратить внимание, скажем, я хочу сделать это только на строках с 6 по 10. Еще раз спасибо! –

+0

@ user3481603 см. Мое обновленное объяснение, но, используя пример Hack-R, вы можете сделать что-то вроде 'df $ E [df $ A> df $ B & df $ B> df $ C & seq_along (df $ C)> = 6)] ' – dcc310

+0

@ user3481603 после вставки бит из ответа Hack-R выше, второе подмножество B> C, когда я думаю, что вы хотели C> B. На всякий случай вам удалось скопировать его в какой-то код медицинского устройства:) – dcc310

1

Я думаю, что это должно работать нормально:

set.seed(1) 
myframe = data.frame(date=1:10, a=sample(1:10), b=sample(1:10),  c=sample(1:10), d=sample(1:10), e=NA) 
myframe[myframe$a > myframe$b & myframe$b > myframe$c, "e"] = "x" 
myframe[myframe$a < myframe$b & myframe$b < myframe$c, "e"] = "y" 
myframe[is.na(myframe$e), "e"] = "z" 
myframe 

дает

 
    date a b c d e 
1  1 3 3 10 5 z 
2  2 4 2 2 6 z 
3  3 5 6 6 4 z 
4  4 7 10 1 2 z 
5  5 2 5 9 10 y 
6  6 8 7 8 8 z 
7  7 9 8 7 9 x 
8  8 6 4 5 1 z 
9  9 10 1 3 7 z 
10 10 1 9 4 3 z 

если x <- 1:4 дает 1 2 3 4 то x < - 1:4 < 3 является TRUE TRUE FALSE FALSE. Таким образом, someFrame[x, "someCol"] выбирает этот col из строк, где x является TRUE, то есть первой и второй строками. То же самое работает для векторов, поэтому c("a", "b", "c", "d")[x] возвращает a b. Я слышал, что это называется «логическое индексирование», для чего оно стоит.

+0

Спасибо! Почему вы можете использовать команду set.seed, если я могу спросить? –

+0

Кроме того, что было бы простым способом уменьшить количество строк в таблице, скажем, я хотел бы лопнуть только в строках 6 thorugh 10. –

+0

@ user3481603, см. Мой комментарий к ответу Hack-R о том, как ограничить до 6 и выше. Функция set.seed состоит в том, чтобы делать примеры, включающие случайность, воспроизводимую для других, иначе вы каждый раз получали бы «случайный» результат. – dcc310

Смежные вопросы