R 如何使用循环创建行?

R 如何使用循环创建行?,r,loops,R,Loops,我的数据集如下所示: ColA; ColB; ColC; PAR; BKK; Y; BKK; SYD; Y; NYC; LAX; Y; LAX; SFO; Y; 我想复制ColC==Y的行,如果一行的colB==colA,那么我想用这些值创建一行:第一行的colA和第二行的colB。在我们的示例中,它将如下所示: ColA; ColB; ColC; PAR; SYD; Y; NYC; SFO; Y; 这些行将被添加到主数据集中 我曾尝试使用for循环,并生成一个临时数据集来rbind这

我的数据集如下所示:

ColA; ColB; ColC;
PAR; BKK; Y;
BKK; SYD; Y;  
NYC; LAX; Y;
LAX; SFO; Y;
我想复制ColC==Y的行,如果一行的colB==colA,那么我想用这些值创建一行:第一行的colA和第二行的colB。在我们的示例中,它将如下所示:

ColA; ColB; ColC;
PAR; SYD; Y; 
NYC; SFO; Y;
这些行将被添加到主数据集中

我曾尝试使用for循环,并生成一个临时数据集来rbind这两个循环,但都不起作用

for (i in 1:nrow(maindataset)){
    for (j in (i+1):nrow(maindataset)-1){
        if (maindataset$colB[i]==maindataset$colA[j] & maindataset$colC[i]==maindataset$colC[j]) {
        newDF<-data.frame(ColA=maindataset$colA[i],ColB=maindataset$colA[j],ColC=maindataset$colA[j],stringsAsFactors = FALSE)
    maindataset<-rbind(maindataset,newDF)
}
}
}
我不确定循环是否是最好的解决方案。你知道我该怎么解决吗


谢谢

通常,每当需要将数据集中的两列相等时,请考虑执行联接。在这种情况下,首先过滤掉colA中存在colB的行,然后可以与原始数据集进行左连接。这将为您提供所需的行。然后,在选择适当的行并根据需要重命名它们之后,可以执行rbind将它们添加到原始数据集中:

图书馆弹琴 > >正在附加包:“dplyr” >以下对象已从“package:stats”屏蔽: > >滤波器,滞后 >以下对象已从“package:base”屏蔽: > >相交、setdiff、setequal、并集 第123集 df% 过滤科拉=马驹 df示例数据帧,其中两列具有来自同一超集的数据 >一个tibble:19x2 >可乐瓶 > >1纳米CT >2 IA TN >佛罗里达州3 >4.我 >5吨正常 >6 WY英寸 >7天 >8或TX >里约热内卢9号 >10个月ID >1100万塔卡 >纽约东北12号 >13 CA TN >北纬14度 >15内华达州 >16新罕布什尔州标准差 >17 OH GA >18德蒙 >东北19公吨 df1% %colA%>%中的filtercolB%筛选“colB”出现在“colA”中的行` left_joindf,by=c'colB'='colA'与原始数据集左连接 df1 >一个tibble:8x3 >可乐 > >1 IA TN正常 >佛罗里达州2 WY >里氏3 WY >4或TX KY >500万吨 >6 CA TN正常 >纽约东北7公吨 >北纬8公吨 df1%>% 选择colB%>% renamecolB=colB.y$colB.y是您需要的列,因此重命名它并删除另一列 >一个tibble:8x2 >可乐瓶 > >1我没问题 >2 WY FL >3怀里 >4或KY >500公吨 >6 CA OK >纽约700万吨 >8公吨悉尼威立雅运输公司
由v0.3.0于2020年2月10日创建。通常,每当您需要将数据集中的两列相等时,请考虑执行联接。在这种情况下,首先过滤掉colA中存在colB的行,然后可以与原始数据集进行左连接。这将为您提供所需的行。然后,在选择适当的行并根据需要重命名它们之后,可以执行rbind将它们添加到原始数据集中:

图书馆弹琴 > >正在附加包:“dplyr” >以下对象已从“package:stats”屏蔽: > >滤波器,滞后 >以下对象已从“package:base”屏蔽: > >相交、setdiff、setequal、并集 第123集 df% 过滤科拉=马驹 df示例数据帧,其中两列具有来自同一超集的数据 >一个tibble:19x2 >可乐瓶 > >1纳米CT >2 IA TN >佛罗里达州3 >4.我 >5吨正常 >6 WY英寸 >7天 >8或TX >里约热内卢9号 >10个月ID >1100万塔卡 >纽约东北12号 >13 CA TN >北纬14度 >15内华达州 >16新罕布什尔州标准差 >17 OH GA >18德蒙 >东北19公吨 df1% %colA%>%中的filtercolB%筛选“colB”出现在“colA”中的行` left_joindf,by=c'colB'='colA'与原始数据集左连接 df1 >一个tibble:8x3 >可乐 > >1 IA TN正常 >佛罗里达州2 WY >里氏3 WY >4或TX KY >500万吨 >6 CA TN正常 >纽约东北7公吨 >北纬8公吨 df1%>% 选择colB%>% renamecolB=colB.y$colB.y是您需要的列,因此重命名它并删除另一列 >一个tibble:8x2 >可乐瓶 > >1我没问题 >2 WY FL >3怀里 >4或KY >500公吨 >6 CA OK >纽约700万吨 >8公吨悉尼威立雅运输公司
由v0.3.0于2020年2月10日创建,您似乎试图获得新的DF,但遇到了一些困难。下面是一个基本的R解决方案,可能会对您有所帮助

newDF <- with(subset(df,ColC == "Y"), 
              data.frame(ColA = ColA[na.omit(p <-match(ColA,ColB))],
                         ColB = ColB[which(!is.na(p))],
                         ColC = "Y"))
资料


你似乎试图获得新的DF,但遇到了一些困难。下面是一个基本的R解决方案,可能会对您有所帮助

newDF <- with(subset(df,ColC == "Y"), 
              data.frame(ColA = ColA[na.omit(p <-match(ColA,ColB))],
                         ColB = ColB[which(!is.na(p))],
                         ColC = "Y"))
资料

df <- structure(list(ColA = c("PAR", "BKK", "NYC", "LAX"), ColB = c("BKK", 
"SYD", "LAX", "SFO"), ColC = c("Y", "Y", "Y", "Y")), class = "data.frame", row.names = c(NA, 
-4L))