2015-10-19 77 views
-2

我要刻畫的關係之間的三重值N1 - 在[RN3每個ID下面DT:比較行配對值的

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>N2N3,當N2>N3

類型B爲三元組時N2>N1N3和。

類型C爲三元組時N3>N1N2,當N2>N1

類型D爲三胞胎當所有三個N值是相等的。

類型E是三胞胎時N2<N1N3

+0

你有什麼迄今所做?你使用什麼語言? – yossico

+0

好點@yossico。我是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

​​

輸出

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")