Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 嵌套循环不会产生所需的结果_R_Loops_For Loop_Foreach - Fatal编程技术网

R 嵌套循环不会产生所需的结果

R 嵌套循环不会产生所需的结果,r,loops,for-loop,foreach,R,Loops,For Loop,Foreach,我对r相当陌生,所以这可能是一个愚蠢的疑问 我有一个数据帧,我想在其中循环遍历特定列中的行,并检查其中的名称是否在另一个变量中。尽管如此,每行中的值可能有多个名称用分号分隔。我需要检查每一个名称。我尝试了一个嵌套循环,但得到了一个重复值列表。我的代码描述如下: # Column in df I want to modify: company.tickers ---------- CARD3 CSAN3 CVCB3 ELET3;ELET5;ELET6 ENBR3 FESA3

我对r相当陌生,所以这可能是一个愚蠢的疑问

我有一个数据帧,我想在其中循环遍历特定列中的行,并检查其中的名称是否在另一个变量中。尽管如此,每行中的值可能有多个名称用分号分隔。我需要检查每一个名称。我尝试了一个嵌套循环,但得到了一个重复值列表。我的代码描述如下:

# Column in df I want to modify:
company.tickers  
----------
CARD3  
CSAN3  
CVCB3  
ELET3;ELET5;ELET6  
ENBR3  
FESA3;FESA4  
OIBR3;OIBR4  
PETR3;PETR4  
PTBL3  
TUPY3  
VLID3  

# stock names I would like to keep
stocks <- c("CARD3", "TUPY3", "OIBR3", "FESA4", "PTBL3", "VLID3","CNTO3","CSAN3","ELET3","PETR4","ENBR3")

result=list()

# Cycle through rows
for (i in 1:length(df.statements$company.tickers)){

  print(df.statements$company.tickers[i])
  stock.tickers <- strsplit(row,";")

  # Cycle through names in a cell
  for (j in 1:length(stock.tickers)) {

    if (stock.tickers[j] %in% stocks){

      print(stock.tickers[j])

      result <- c( result, stock.tickers[j])

    }

  }

}

# My expected result is the following column:
company.tickers 
----------
CARD3  
CSAN3  
CVCB3  
ELET3
ENBR3  
FESA4  
OIBR3
PETR4  
PTBL3  
TUPY3  
VLID3 

也许是这样的

#build regex
stocks.regex <- paste0( stocks, collapse = "|")
#subset using grepl ans the new regex
subset( df, grepl( stocks.regex, df$company.tickers ) )
样本数据

温佩尔非常聪明的答案的另一个替代品:

SuppressPackageStatupMessagesLibraryDplyr company.tickers=c 卡片3, CSAN3, CVCB3, ELET3;ELET5;ELET6, ENBR3, FESA3;二月四日, OIBR3;OIBR4, PETR3;彼得4, PTBL3, 图3, VLID3 股票价格:10 x 1 >公司股票 > >1卡3 >2图3 >3 OIBR3;OIBR4 >FESA3;硫酸亚铁 >5 PTBL3 >6VLID3 >7 CSAN3 >8 ELET3;ELET5;ELET6 >9.3;彼得4 >10 ENBR3 由v0.3.0于2020-03-03创建,这里尝试使用tidyr::separate将tickers列临时拆分为单独的列。延长/整理数据,然后对其进行过滤以获得所需的内容

如果您能提出有助于改进此技术的意见,我将不胜感激

SuppressPackageStatupMessagesLibraryDplyr suppressPackageStartupMessageslibrarytidyr SuppressPackageStartupMessagesLibraryPurr company.tickers=c 卡片3, CSAN3, CVCB3, ELET3;ELET5;ELET6, ENBR3, FESA3;二月四日, OIBR3;OIBR4, PETR3;彼得4, PTBL3, 图3, VLID3 随机数据% 选择company.tickers,所有内容,-name >警告:预计3件。在10行[1,2,3, > 5, 6, 7, 8, 9, 10, 11]. >一个tibble:10x2 >company.tickers.random.data > >1.3 0.568 >2 CSAN3 0.0370 >3 ELET3 0.119 >4 ENBR3 0.276 >5 FESA4 0.196 >6 OIBR3 0.301 >7.4 0.504 >8 PTBL3 0.712 >9图比3 0.790 >10 VLID3 0.956
由v0.3.0于2020-03-05创建,可能我不清楚或不理解你们编写的代码。结果应该只有库存中的项目。因此,应将OIBR4、FESA3、PETR3、ELET5和ELET6从色谱柱中去除。我的主要问题是处理有多个值用分号分隔的行。哦,好吧,我确实想知道,但是你的问题不够具体。模拟一个你想要的结果的例子通常是个好主意。我开始写一个答案,使用tidyr::separate将字符串用分号分开,但后来改变了策略。我再试一次。也许你可以编辑你的问题只是为了完全清楚你需要什么结果。这个答案使用purrr的映射函数来生成你在原始问题中所问的循环过程。我的另一个答案没有以同样的方式进行显式循环。答案是Thnx!我仍然得到了一个与预期不同的结果:一个tibble:13x2,PETR3和ELET6不应该在那里。我已经提供了一个reprex,所以如果你的结果不同,你必须键入与我提供的不同的内容,或者有一些明显不同的软件包版本!如果你不知道怎么做,也不知道会发生什么,试着提供reprex搜索。你有16只股票在“股票行情”列中提到,11只股票在股票中列出,其中1只CNTO3不匹配。所以我想你会得到一个10行的tibble作为期望的输出。
library(data.table)
df <- setDF(fread("company.tickers  
CARD3  
CSAN3  
CVCB3  
ELET3;ELET5;ELET6  
ENBR3  
FESA3;FESA4  
OIBR3;OIBR4  
PETR3;PETR4  
PTBL3  
TUPY3  
VLID3", sep = ","))

stocks <- c("CARD3", "TUPY3", "OIBR3", "FESA4", "PTBL3", "VLID3","CNTO3","CSAN3","ELET3","PETR4","ENBR3")