在 R 中子设置或排列数据
Sub-setting or arrange the data in R
由于我是R的新手,这个问题对你来说可能是小菜一碟。
我有一个txt格式的数据。第一列有簇号,第二列有不同生物的名称。
例如:
- 0 org4|gene759
- 1 org1|gene992
- 2 org1|gene1101
- 3 org4|gene757
- 4 org1|gene1702
- 5 org1|gene989
- 6 org1|gene990
- 7 org1|gene1699
- 9 org1|gene1102
- 10 org4|gene2439
- 10 org1|gene1374
我需要re-arrange/reshape以下格式的数据。
集群号 org 1 org 2 org3 org4
- 0 0 0 1
- 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))))
由于我是R的新手,这个问题对你来说可能是小菜一碟。 我有一个txt格式的数据。第一列有簇号,第二列有不同生物的名称。 例如:
- 0 org4|gene759
- 1 org1|gene992
- 2 org1|gene1101
- 3 org4|gene757
- 4 org1|gene1702
- 5 org1|gene989
- 6 org1|gene990
- 7 org1|gene1699
- 9 org1|gene1102
- 10 org4|gene2439
- 10 org1|gene1374
我需要re-arrange/reshape以下格式的数据。
集群号 org 1 org 2 org3 org4
- 0 0 0 1
- 1 0 0 0
我不知道如何在 R 中做到这一点。 谢谢
可以用
将 table 读入 Rinput <- 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))))