2015-10-19 79 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")