【问题标题】:Comparison of row-paired values in three column三列中行配对值的比较
【发布时间】:2015-10-19 22:33:08
【问题描述】:

我想为 R 中 dt 之后的每个 id 表征三元组值N1-N3 之间的关系:

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 > N2N3N2 > N3

N2 > N1N3 时,类型B 用于三元组。

N3 N1N2 时,C 用于三元组N2 > N1

当所有三个N 值相等时,类型D 用于三元组。

E 用于三胞胎 N2 N1N3

【问题讨论】:

  • 到目前为止你做了什么?你用什么语言?
  • 好点@yossico。我是 R 新手,在进行项目时正在学习。不知道最好的学习方法是什么。我想从更有经验的程序员那里找到一个例子,而不是养成用糟糕的形式做事的习惯。我同意最好先尝试并在询问之前发布进度。谢谢!

标签: r data.table


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您可以使用嵌套的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")
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-19
        • 2020-10-26
        • 2022-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-30
        • 1970-01-01
        相关资源
        最近更新 更多