在R中使用for和If循环来转换数据

时间:2018-05-01 20:11:10

标签: r

我正在尝试将我的矩阵转换为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循环,但我无法提出解决方案。你有任何代码来解决这个问题吗?

2 个答案:

答案 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))