【问题标题】:How to pair rows with the same value in one column of a dataframe in R如何在R中的数据框的一列中将具有相同值的行配对
【发布时间】:2017-02-05 15:46:02
【问题描述】:

我有以下形式的数据:

set.seed(1234)
data <- data.frame(cbind(runif(40,0,10), rep(seq(1,20,1), each = 2)))
data <- data[sample(nrow(data)),]
colnames(data) <- c("obs","subject")
head(data)

    obs      subject
1.5904600      12
8.1059855      13
5.4497484       6
0.3999592      12
2.5880982      19
2.6682078       9
   ...         ...

假设我只有两个观察值(列“obs”)按主题(列“主题”,其中主题编号从 1 到 20)。

我想按“主题”列的值对行进行“分组”。更准确地说,我想按主题“排序”数据,但保留上面显示的顺序。因此,最终数据将是这样的:

    obs      subject
1.5904600      12
0.3999592      12
8.1059855      13
2.3656473      13
5.4497484       6
7.2934746       6

有什么想法吗?我想也许可以用which 识别与主题相对应的每一行:

which(data$subject==x)

然后rbind 这些行在一个循环中,但我确信有一种更简单、更快的方法来做到这一点,不是吗?

【问题讨论】:

  • 您的示例数据是矩阵,它应该是 data.frame 吗?
  • 试试这样的:data[order(data$subject), ]
  • @Bulat 我们将丢失原始订单。
  • data[order(factor(data[, 'subject'], levels = unique(data[, 'subject'])), ]
  • 哦,好的。是的,可以通过独特的因素分解。

标签: r dataframe group-by


【解决方案1】:

通过obs 嵌套数据并再次取消嵌套。生成的 tibble 将保留原始顺序,但 subject 将被分组。

library(tidyr)
data %>% nest(obs) %>% unnest()

# A tibble: 6 × 2
#  subject       obs
#    <int>     <dbl>
#1      12 1.5904600
#2      12 0.3999592
#3      13 8.1059855
#4       6 5.4497484
#5      19 2.5880982
#6       9 2.6682078

【讨论】:

    【解决方案2】:

    它基于 zx8754 但它确实保留了数据类型:

    library(dplyr) #arrange function
    
    group<-factor(data[,'subject'], levels=unique(data[,'subject']))
    data<-cbind(data,group)
    data<-arrange(as.data.frame(data),group)
    data<-as.matrix(data[,-3])
    

    【讨论】:

      【解决方案3】:

      dplyr是一个很棒的包,里面有各种有用的动词,其中一个是arrange(variable),它在这里做你想做的,而且更优雅(结果一般也是一个data.frame,所以你不需要cbind):

      require(dplyr)
      as.data.frame(data) %>% arrange(subject)
      # or, if you want reverse order:
      as.data.frame(data) %>% arrange(-subject)
      

      (就此而言,data.table 也很棒。事实上,您可以将它们合并到 dtplyr 包中)

      【讨论】:

      • 这不是 OP 想要的,检查输出。
      • 哦,您的意思是按“主题”排序,然后按“obs”的原始排序。将修复
      【解决方案4】:

      先转换为因子,然后排序:

      data$group <- factor(data$subject, levels = unique(data$subject))
      data[ order(data$group), ]
      
      #           obs subject group
      # 1  1.59046003      12    12
      # 4  0.39995918      12    12
      # 2  8.10598552      13    13
      # 30 2.18799541      13    13
      # ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多