2015-10-19 7 views
-2

Я хочу, чтобы охарактеризовать отношения между триплет значения N1 - N3 для каждого идентификатора следующей DT в R:Сравнение строк-парных значений в трех колонке

id N1 N2 N3 
1  3  2  1  
2  3  2  2  
3  3  4  1  
4  2  3  2  
5  1  2  3  
6  2  2  4  
7  2  2  2  
8  2  1  3  

Хочу сделать новый столбец, который дает классификацию типа отношений между значениями в трех столбцах N следующим образом:

id N1 N2 N3 type1 
1  3  2  1  A 
2  3  2  2  A 
3  3  4  1  B 
4  2  3  2  B 
5  1  2  3  C 
6  2  2  4  C 
7  2  2  2  D 
8  2  1  3  E 

Тип A для тройни, когда N1>N2 и N3, когда N2>N3.

Тип B для тройни, когда N2>N1 и N3.

Тип C для тройни, когда N3>N1 и N2, когда N2>N1

Тип D для тройни, когда все три N значения равны.

Тип E для тройни, когда N2<N1 и N3

+0

Что вы сделали до сих пор? какой язык вы используете? – yossico

+0

Хорошая точка @ йоссико. Я новичок в R и изучаю, когда я иду по проекту. Не уверен, что лучший способ узнать. Я хотел найти пример у более опытного программиста вместо того, чтобы привыкнуть делать что-то плохое. Я согласен с тем, что лучше попробовать сначала и опубликовать прогресс, прежде чем спрашивать. Спасибо! – ejg

ответ

3

data.table решение:

require(data.table) 
dt <- data.table(id=1:8, N1=c(3,3,3,2,2,2,2,2), N2=c(2,2,4,3,1,2,2,1), N3=c(1,2,1,2,3,4,2,3)) 
dt[N1 > N2 & N1 > N3 & N2 > N3, type1 := 'A'] 
dt[N2 > N1 & N2 > N3, type1 := 'B'] 
dt[N3 > N1 & N3 > N2 & N2 > N1, type1 := 'C'] 
dt[N1 == N2 & N1 == N3, type1 := 'D'] 
dt[N2 < N1 & N2 < N3, type1 := 'E'] 

dt

id N1 N2 N3 type1 
1: 1 3 2 1  A 
2: 2 3 2 2 NA 
3: 3 3 4 1  B 
4: 4 2 3 2  B 
5: 5 2 1 3  E 
6: 6 2 2 4 NA 
7: 7 2 2 2  D 
8: 8 2 1 3  E 
+0

Спасибо @David! – ejg

1

Вы можете сделать это с вложенными ifelse заявления, используя with(dat, ...) избежать повторно набрав dat$:

dat$type1 = with(dat, ifelse(N1 > N2 & N1 > N3, "A", 
         ifelse(N2 > N1 & N2 > N3, "B", 
          ifelse(N3 > N1 & N3 > N2, "C", 
          ifelse(N1 == N2 & N1 == N3, "D", 
           ifelse(N2 < N1 & N2 < N3, "E", NA)))))) 
dat 
# id N1 N2 N3 type1 
# 1 1 3 2 1  A 
# 2 2 3 2 2  A 
# 3 3 3 4 1  B 
# 4 4 2 3 2  B 
# 5 5 2 1 3  C 
# 6 6 2 2 4  C 
# 7 7 2 2 2  D 
# 8 8 2 1 3  C 

данных:

dat = structure(list(id = 1:8, N1 = c(3L, 3L, 3L, 2L, 2L, 2L, 2L, 2L 
), N2 = c(2L, 2L, 4L, 3L, 1L, 2L, 2L, 1L), N3 = c(1L, 2L, 1L, 
2L, 3L, 4L, 2L, 3L)), .Names = c("id", "N1", "N2", "N3"), row.names = c(NA, 
-8L), class = "data.frame") 
1

Использование dplyr:

library(dplyr) 
df %>% 
    mutate(type1 = ifelse(N1 > N2 & N1 > N3 & N2 > N3, "A", 
         ifelse(N2 > N1 & N2 > N3, "B", 
           ifelse(N3 > N1 & N3 > N2 & N2 > N1, "C", 
             ifelse(N1 == N2 & N1 == N3, "D", 
              ifelse(N2 < N1 & N2 < N3, "E", NA)))))) 

Выход

id N1 N2 N3 type1 
1 1 3 2 1  A 
2 2 3 2 2 <NA> 
3 3 3 4 1  B 
4 4 2 3 2  B 
5 5 2 1 3  E 
6 6 2 2 4 <NA> 
7 7 2 2 2  D 
8 8 2 1 3  E 

данных

df <- structure(list(id = 1:8, N1 = c(3L, 3L, 3L, 2L, 2L, 2L, 2L, 2L 
), N2 = c(2L, 2L, 4L, 3L, 1L, 2L, 2L, 1L), N3 = c(1L, 2L, 1L, 2L, 3L, 4L, 2L, 3L)), .Names = c("id", "N1", "N2", "N3"), row.names = c(NA, -8L), class = "data.frame") 
Смежные вопросы