我正在努力重新排序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))
我的目标是转换看起来像这样的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"))
非常感谢您!
答案 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)
将行名称转换为一列,整形为长形,然后将键(即原始列名称)分隔为列group
和no
,将后者转换为数字。排序,重新变大,再次排序,将rowname
和group
合并,并在每个列名前加上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))