Используйте для и если циклы в R для преобразования данных - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь преобразовать свою матрицу в другой формат в 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 голосов
/ 01 мая 2018

вы можете использовать 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
0 голосов
/ 01 мая 2018

Один из многих доступных параметров может быть следующим:

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

Мне просто интересно, как ОП создал такую ​​матрицу / 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...