首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >子设置或排列R中的数据

子设置或排列R中的数据
EN

Stack Overflow用户
提问于 2018-04-28 16:59:59
回答 2查看 90关注 0票数 2

因为我对R不熟悉,这个问题在你看来可能是小菜一碟。我有txt格式的数据。第一列有簇号,第二列有不同有机体的名称。例如:

  1. 0 org4基因759
  2. 1 org1_
  3. 2 org1_
  4. 3 org4_基因757
  5. 4 org1基因1702
  6. 5 org1\x{e76f}基因989
  7. 6 org1\x{e76f}基因990
  8. 7 org1 x-Gene1699
  9. 9 org1 x-基因1102
  10. 10 org4基因2439
  11. 10 org1基因1374

我需要重新安排/重塑以下格式的数据。

簇号。Org 1 Org 2 org3 org4

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

我不知道在R.怎么做谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-29 02:33:15

我们可以用table

代码语言:javascript
运行
复制
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

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

代码语言:javascript
运行
复制
out1 <- as.data.frame.matrix(table(df1[[1]], 
    factor(sub("\\|.*", "", df1[[2]]), levels = paste0("org", 1:4))))
票数 2
EN

Stack Overflow用户

发布于 2018-04-28 20:22:30

将表读入R可以通过以下方式完成

代码语言:javascript
运行
复制
input <- read.table('filename.txt')

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

代码语言:javascript
运行
复制
input[, 3] <- gsub('^org(.+)\\|.*', '\\1', input[, 2])

我们的输入数据现在如下所示:

代码语言:javascript
运行
复制
> 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的可能值

代码语言:javascript
运行
复制
possibleOrgs <- seq_len(max(input[, 3])) # = c(1, 2, 3, 4)

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

代码语言:javascript
运行
复制
result <- vapply(unique(input[, 1]), function (x) 
  possibleOrgs %in% input[input[, 1] == x, 3], logical(4)))

然后,我们可以根据我们的喜好格式化这个结果,也许可以使用t来转换它的方向,使用* 1来从真和假转换为1和0,使用colnames来命名它的列:

代码语言:javascript
运行
复制
result <- t(result) * 1
colnames (result) <- paste0('org', possibleOrgs)
rownames(result) <- unique(input[, 1])

我希望这就是你想要的--从你的问题上看不太清楚!

输出:

代码语言:javascript
运行
复制
> 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50078989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档