【问题标题】:Append dataFrame columns to other columns with different names and order?将 dataFrame 列附加到具有不同名称和顺序的其他列?
【发布时间】:2018-08-04 16:41:31
【问题描述】:

我正在努力在 R 中重新排序数据帧。

我的 dataFrame 有来自两个不同传感器的数据。因此,在开始时,每一列都有一个名称,其语法为“传感器编号.样本编号”。 rowname 是每个样本的坐标。

遗憾的是,这些列没有按样本编号升序排列。 如何在数字 1 之后是 2 而不是 10 的情况下进行自动排序?

使用正确的有序列,我想剪切第二个传感器的所有列并将其附加到第一个传感器的行下方。这也很棘手,因为每个传感器的列数在现实中会有所不同。 为了区分这两个传感器,我会为新的行名添加一个后缀“a”或“b”。

我的问题是我知道“rbind”,但它需要相同的列名,我不能在这里提供。而且我还需要手动选择列,因为我不知道如何自动选择所有第二个传感器。

我目前的想法是为每个传感器制作子集,重命名列,然后将 rbind 与两个子集一起使用。这是个好主意吗?

然后我可以使用 paste() 修改行名。

我现在展示简化的框架,因为原始框架相当大。所以数字 (c(1:3)) 只是示例性的。

这是我的 dataFrame 开始时的样子:

myDf = data.frame(a.10= c(1:3),a.11= c(1:3),a.12= c(1:3),a.13= c(1:3),a.2= c(1:3),a.3= c(1:3),a.4= c(1:3),a.5= c(1:3),a.6= c(1:3),a.7= c(1:3),a.8= c(1:3),a.9= c(1:3),
b.1= c(1:3),b.10= c(1:3),b.11= c(1:3),b.2= c(1:3),b.3= c(1:3),b.4= c(1:3),b.5= c(1:3),b.6= c(1:3),b.7= c(1:3),b.8= c(1:3),b.9= c(1:3))

我的目标是转换如下所示的数据帧:

desiredDf =data.frame(n9=rep(c(1:3),2), n10=rep(c(1:3),2), n11=rep(c(1:3),2), n12=c(c(1:3),NA, NA, NA), n13=c(c(1:3), NA, NA, NA))
rownames(desiredDf)<-(c("1a","2a","3a","1b","2b","3b"))

非常感谢!

【问题讨论】:

  • 您需要将名称设置为匹配,以便可以将它们排列起来,例如与names(myDF) &lt;- sub('a.', 'n', names(myDF), fixed = TRUE)。此时要使用rbind,您必须重新排列列,例如与order。 dplyr 和 data.table 的等价物可以自动匹配名称。

标签: r


【解决方案1】:

这是一个选项。

library(tidyverse)
myDF2 <- myDf %>% gather(measure, result, a.10:b.9) %>%
    separate(measure, into = c("letter", "number"), sep = "\\.") %>%
    group_by(letter, number)%>%
    mutate(n = row_number()) %>%
    unite(col, n, letter, sep = "") %>%
    ungroup() %>%
    arrange(as.numeric(number))%>%
    mutate(number = paste0("n", number))%>%
    mutate(number = factor(number, levels = unique(number)))%>%
    spread(number, result)%>%
    arrange(col)

row.names(myDF2) <- myDF2$col
myDF2$col <- NULL

【讨论】:

  • 非常感谢!有一个小错误。它应该是“a.1”而不是“a.10”:-)
【解决方案2】:

将行名转换为列,重新整形为长格式并将键(即原始列名)分成groupno列,将后者转换为数字。排序,重新整形为宽格式,再次排序,合并rownamegroup,并在每个列名前加上n

library(dplyr)
library(tibble)
library(tidyr)

myDf %>%
  rownames_to_column %>% 
  gather(key, value, -rowname) %>%
  separate(key, c("group", "no"), convert = TRUE) %>%
  arrange(group, no) %>%
  spread(no, value) %>%
  arrange(group, rowname) %>%
  unite(rowname, rowname, group, sep = "") %>%
  column_to_rownames %>%
  rename_all(~ paste0("n", .))

给予:

   n1 n2 n3 n4 n5 n6 n7 n8 n9 n10 n11 n12 n13
1a NA  1  1  1  1  1  1  1  1   1   1   1   1
2a NA  2  2  2  2  2  2  2  2   2   2   2   2
3a NA  3  3  3  3  3  3  3  3   3   3   3   3
1b  1  1  1  1  1  1  1  1  1   1   1  NA  NA
2b  2  2  2  2  2  2  2  2  2   2   2  NA  NA
3b  3  3  3  3  3  3  3  3  3   3   3  NA  NA

注意

上面我们将它用于myDf,即输入。

myDf <-
structure(list(a.10 = 1:3, a.11 = 1:3, a.12 = 1:3, a.13 = 1:3, 
    a.2 = 1:3, a.3 = 1:3, a.4 = 1:3, a.5 = 1:3, a.6 = 1:3, a.7 = 1:3, 
    a.8 = 1:3, a.9 = 1:3, b.1 = 1:3, b.10 = 1:3, b.11 = 1:3, 
    b.2 = 1:3, b.3 = 1:3, b.4 = 1:3, b.5 = 1:3, b.6 = 1:3, b.7 = 1:3, 
    b.8 = 1:3, b.9 = 1:3), class = "data.frame", row.names = c(NA, 
-3L))

【讨论】:

    猜你喜欢
    • 2019-07-27
    • 2023-02-09
    • 2018-06-02
    • 2012-10-23
    • 2012-05-23
    • 2021-12-22
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    相关资源
    最近更新 更多