【问题标题】:Perform function over groups in columns in R对 R 中的列中的组执行功能
【发布时间】:2014-11-30 00:36:16
【问题描述】:

我对 R 完全陌生,并且有一个关于在列上执行函数的问题。

data <- read.table(text ="group;  val
                a;  4
                a;  24
                a;  12
                b;  1
                a;  2
                c;  4
                c;  5
                b;  6 ", sep=";", header=T,stringsAsFactors = FALSE)

如何通过以下方式添加数据?

我想创建两个新列,我正在这样做:

data$col1 <- 0
data$col2 <- 1

我现在要做的是将每个组值的 +2 添加到新列中并达到以下模式:

group val   col1 col2
  a     4     0   1
  a    24     0   1
  a    12     0   1
  b     1     2   3
  a     2     0   1
  c     4     4   5
  c     5     4   5
  b     6     2   3

我怎么能这样做?我希望我的例子或多或少地清楚了。

【问题讨论】:

    标签: r function grouping


    【解决方案1】:

    试试这个:

    创建索引以根据组数累计添加+2

    indx <- c(0, 2 * seq_len(length(unique(data[, 1])) - 1)) 
    

    按组拆分数据集,添加(累积)+2 并取消拆分,以便一切恢复原状

    data[, 3:4] <- unsplit(Map(`+`, split(data[, 3:4], data[, 1]), indx), data[, 1]) 
    data
    #   group val col1 col2
    # 1     a   4    0    1
    # 2     a  24    0    1
    # 3     a  12    0    1
    # 4     b   1    2    3
    # 5     a   2    0    1
    # 6     c   4    4    5
    # 7     c   5    4    5
    # 8     b   6    2    3
    

    【讨论】:

      【解决方案2】:

      或者你可以这样做

      within(data, {col1 <- 2*(as.numeric(factor(group))-1)
                        col2 <- col1+1})[,c(1:2,4:3)]
      #  group val col1 col2
      #1     a   4    0    1
      #2     a  24    0    1
      #3     a  12    0    1
      #4     b   1    2    3
      #5     a   2    0    1
      #6     c   4    4    5
      #7     c   5    4    5
      #8     b   6    2    3
      

      使用data.table

      library(data.table)
       setDT(data)[,c('col1', 'col2'):= {list(indx=2*(match(group,
                                          unique(group))-1), indx+1)}]
      
      data
      #   group val col1 col2
      #1:     a   4    0    1
      #2:     a  24    0    1
      #3:     a  12    0    1
      #4:     b   1    2    3
      #5:     a   2    0    1
      #6:     c   4    4    5
      #7:     c   5    4    5
      #8:     b   6    2    3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-14
        • 1970-01-01
        • 2018-03-27
        • 1970-01-01
        • 1970-01-01
        • 2020-01-26
        相关资源
        最近更新 更多