在 R 中子设置或排列数据

Sub-setting or arrange the data in R

由于我是R的新手,这个问题对你来说可能是小菜一碟。 我有一个txt格式的数据。第一列有簇号,第二列有不同生物的名称。 例如:

  1. 0 org4|gene759
  2. 1 org1|gene992
  3. 2 org1|gene1101
  4. 3 org4|gene757
  5. 4 org1|gene1702
  6. 5 org1|gene989
  7. 6 org1|gene990
  8. 7 org1|gene1699
  9. 9 org1|gene1102
  10. 10 org4|gene2439
  11. 10 org1|gene1374

我需要re-arrange/reshape以下格式的数据。

集群号 org 1 org 2 org3 org4


  1. 0 0 0 1
  2. 1 0 0 0

我不知道如何在 R 中做到这一点。 谢谢

可以用

将 table 读入 R
input <- read.table('filename.txt')

然后我们可以使用正则表达式从 org4|gene759 字符串中提取相关数字,并将其设置为我们输入的第三列:

input[, 3] <- gsub('^org(.+)\|.*', '\1', input[, 2])

我们的输入数据现在看起来像这样:

> input
   V1            V2 V3
1   0  org4|gene759  4
2   1  org1|gene992  1
3   2 org1|gene1101  1
4   3  org4|gene757  4
5   4 org1|gene1702  1
6   5  org1|gene989  1
7   6  org1|gene990  1
8   7 org1|gene1699  1
9   9 org1|gene1102  1
10 10 org4|gene2439  4
11 10 org1|gene1374  1

然后我们需要列出org的可能值:

possibleOrgs <- seq_len(max(input[, 3])) # = c(1, 2, 3, 4)

现在是棘手的部分。以下函数依次获取每个唯一的集群编号(我注意到 10 在您的示例数据中出现了两次),获取与该集群相关的所有行,并查看这些行的 org 值。

result <- vapply(unique(input[, 1]), function (x) 
  possibleOrgs %in% input[input[, 1] == x, 3], logical(4)))

然后我们可以根据需要格式化这个结果,也许使用 t 来转换它的方向,* 1 将 TRUEs 和 FALSEs 转换为 1s 和 0s,以及 colnames 到为其列命名:

result <- t(result) * 1
colnames (result) <- paste0('org', possibleOrgs)
rownames(result) <- unique(input[, 1])

我希望这就是您要找的内容 -- 您的问题不是很清楚!

输出:

> result

   org1 org2 org3 org4
0     0    0    0    1
1     1    0    0    0
2     1    0    0    0
3     0    0    0    1
4     1    0    0    0
5     1    0    0    0
6     1    0    0    0
7     1    0    0    0
9     1    0    0    0
10    1    0    0    1

我们可以使用table

out <- cbind(ClusterNo = seq_len(nrow(df1)), as.data.frame.matrix(table(seq_len(nrow(df1)), 
       factor(sub("\|.*", "", df1[[2]]), levels = paste0("org", 1:4)))))

head(out, 2)
#    ClusterNo org1 org2 org3 org4
#1         1    0    0    0    1
#2         2    1    0    0    0

也有可能我们需要使用第一列来获取频率

out1 <- as.data.frame.matrix(table(df1[[1]], 
    factor(sub("\|.*", "", df1[[2]]), levels = paste0("org", 1:4))))