将dataFrame列追加到其他具有不同名称和顺序的列吗?

时间:2018-08-04 16:41:32

标签: r

我正在努力重新排序R中的dataFrame。

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

遗憾的是,这些列未按升序排列。 我如何在第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))

enter image description here

我的目标是转换看起来像这样的dataFrame:

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

enter image description here

非常感谢您!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

将行名称转换为一列,整形为长形,然后将键(即原始列名称)分隔为列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))