我正在尝试将我的矩阵转换为R中的另一种格式,但由于我没有太多的for / if循环编码经验,我失败了。任何帮助表示赞赏。
我的矩阵演示如下:
S K1 K1 K2 K2 K3 K3 K4 K4 K5 K5
1 A P A A A A P A A A
2 A A A A A A A A P P
3 A P A A A A P A A A
4 A P A A A A P A A A
5 A P A A A A A A P A
A =缺席P =现在
我想检索当前列的列名并打印它们。每个样品有2个P柱。所以最终的结果应该是
S V1 V1
1 K1 K4
2 K5 K5
3 K1 K4
4 K1 K4
5 K1 K5
我知道这是一个简单的for / if循环,但我无法提出解决方案。你有任何代码来解决这个问题吗?
答案 0 :(得分:1)
您可以使用data.table
library(data.table)
setDT(melt(df,1))[value=="P"][order(S),as.list(sub("[.].*","",variable)),by=S]
S V1 V2
1: 1 K1 K4
2: 2 K5 K5
3: 3 K1 K4
4: 4 K1 K4
5: 5 K1 K5
答案 1 :(得分:0)
许多可用选项中的一个可以是:
df_res <- cbind(df[1],t(apply(df[-1], 1, function(x)names(df)[which(x=="P")+1])))
#write result to a csv file
write.csv(df_res, file = "d:\\MyData.csv",row.names=FALSE)
# S 1 2
# 1 1 K1 K4
# 2 2 K5 K5
# 3 3 K1 K4
# 4 4 K1 K4
# 5 5 K1 K5
我只是想知道OP是如何创建这样的matrix / data.frame的。
数据:强>
df <- read.table(text =
"S K1 K1 K2 K2 K3 K3 K4 K4 K5 K5
1 A P A A A A P A A A
2 A A A A A A A A P P
3 A P A A A A P A A A
4 A P A A A A P A A A
5 A P A A A A A A P A",
header = TRUE, stringsAsFactors = FALSE)
#Change the name of columns
names(df) <- sub("(.*)\\.\\d+","\\1",names(df))