我有一个由几个列组成的数据框架,每个列对应于每个国家不同的行业。我有56个行业和43个国家,我只选择5至22个国家的工业(18个行业)。最大的问题是每个国家的每个行业都被命名为: AUS1,AUS2 .,AUS56。我要选择的是AUS5到AUS22,AUT5到AUT22 .一个可行的解决方案可以是按照以下算法选择列:感兴趣的第一列,即AUS5对应于第10列,然后选择AUS22 (对应于第27列)。然后,我应该跳过AUS的所有其余列(即AUS23到AUS56),跳过下一个国家的前4列(从AUT1到AUT4)。然后,我像以前一样,为AUT选择从5到22的行业。基本上,从第10列开始的算法应该能够选择18列(包括第10列),然后跳过接下来的38列,然后选择下18列。所有43个国家都应重复这一进程。我该怎么编码呢?
更新,示例:
df=data.frame(industry = c("C10","C11","C12","C13"),
country = c("USA"),
AUS3 = runif(4),
AUS4 = runif(4),
AUS5 = runif(4),
AUS6 = runif(4),
DEU5 = runif(4),
DEU6 = runif(4),
DEU7 = runif(4),
DEU8 = runif(4))
#I'm interested only in C10-c11:
df_a=df %>% filter(grepl('C10|C11',industry))
df_a
#Thus, how can I select columns AUS10,AUS11, DEU10,DEU11 efficiently, considering that I have a huge dataset?发布于 2022-09-18 12:11:25
演示paste0方法。
ctr <- unique(gsub('\\d', '', names(df[-(1:2)])))
# ctr <- c("AUS", "DEU") ## alternatively hard-coded
ind <- c(10, 11)
subset(df, industry == paste0('C', 10:11),
select=c('industry', 'country', paste0(rep(ctr, each=length(ind)), ind)))
# industry country AUS10 AUS11 DEU10 DEU11
# 1 C10 USA 0.3376674 0.1568496 0.5033433 0.7327734
# 2 C11 USA 0.7421840 0.6808892 0.9050158 0.3689741或者,既然你似乎喜欢grep,你就可以做到。
df[grep('10|11', df$industry), grep('industry|country|[A-Z]{3}1[01]', names(df))]
# industry country AUS10 AUS11 DEU10 DEU11
# 1 C10 USA 0.3376674 0.1568496 0.5033433 0.7327734
# 2 C11 USA 0.7421840 0.6808892 0.9050158 0.3689741发布于 2022-09-18 12:23:57
如果内存中有一个大数据集,那么data.table和快得多可能是理想的选择。类似于下面的内容可以工作,不过您需要按照实际数据集上的需要使用select_ind和select_ctr。
如果可能的话,给我们举个稍微大一点的玩具例子也许是值得的。
library(data.table)
setDT(df)
select_ind <- paste0(c("C"), c("11","10"))
select_ctr <- paste0(rep(c("AUS", "DEU"), each = 2), c("10","11"))
df[grepl(paste0(select_ind, collapse = "|"), industry), # select rows
..select_ctr] # select columns
AUS10 AUS11 DEU10 DEU11
1: 0.9040223 0.2638725 0.9779399 0.1672789
2: 0.6162678 0.3095942 0.1527307 0.6270880有关更多信息,请参见data.table。
https://stackoverflow.com/questions/73762276
复制相似问题