Вот мой df (мой полный набор данных - до 20 элементов столбцов, для простоты просто покажите первые 3, то есть INC_D.1, INC_D.2, INC_D.3):
Item <- c("A","B","C")
INC_D.1 <- c("10A345","255789","402B56")
CODE_D.1 <- c("2","4","5")
INC_D.2 <- c("675C98","404D34","203559")
CODE_D.2 <- c("5","3","2")
INC_D.3 <- c("LG99w0e03","1025gg205","w2krt2")
CODE_D.3 <- c("3","2","2")
df <- as.data.frame(cbind(Item,INC_D.1,CODE_D.1,INC_D.2,CODE_D.2,INC_D.3,CODE_D.3))
Первоначально я использую следующий код для проверки существования или отсутствия столбца и создания новой переменной одна за другой:
if("CODE_D.1" %in% colnames(df))
{df$INC_D.1 <- as.character(df$INC_D.1)
df$INC_D.1.2only <- as.character(ifelse(df$CODE_D.1=="2",df$INC_D.1,""))}
if("CODE_D.2" %in% colnames(df))
{df$INC_D.2 <- as.character(df$INC_D.2)
df$INC_D.2.2only <- as.character(ifelse(df$CODE_D.2=="2",df$INC_D.2,""))}
if("CODE_D.3" %in% colnames(df))
{df$INC_D.3 <- as.character(df$INC_D.3)
df$INC_D.3.2only <- as.character(ifelse(df$CODE_D.3=="2",df$INC_D.3,""))}
Я пытаюсь переписать код с помощью forloop:
for (i in 1:3){
if(paste0("CODE_D.",i) %in% colnames(df)){
for (j in 1:nrow(df)){
if(df[paste0("CODE_D.",i)][j,]=="2"){
print(paste0("True:[INC=",i,",ROW=",j,"]")) #Check
df[paste0("INC_D.",i,".2only")] <- c(rep("",nrow(df)))
df[paste0("INC_D.",i,".2only")][j,] <- as.character(df[paste0("INC_D.",i)][j,])
}
}
}
}
Цикл for может работать, но отсутствует только один элемент INC_D.3.2, вот вывод:
[1] "True:[INC=1,ROW=1]"
[1] "True:[INC=2,ROW=3]"
[1] "True:[INC=3,ROW=2]"
[1] "True:[INC=3,ROW=3]"
> df
Item INC_D.1 CODE_D.1 INC_D.2 CODE_D.2 INC_D.3 CODE_D.3 INC_D.1.2only INC_D.2.2only INC_D.3.2only
1 A 10A345 2 675C98 5 LG99w0e03 3 10A345
2 B 255789 4 404D34 3 1025gg205 2
3 C 402B56 5 203559 2 w2krt2 2 203559 w2krt2
Как я могу изменить, чтобы получить желаемый вывод