R 嵌套循环不会产生所需的结果
我对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
# 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")