首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从数据帧中选择列

从数据帧中选择列
EN

Stack Overflow用户
提问于 2022-09-18 11:15:14
回答 2查看 71关注 0票数 0

我有一个由几个列组成的数据框架,每个列对应于每个国家不同的行业。我有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个国家都应重复这一进程。我该怎么编码呢?

更新,示例:

代码语言:javascript
复制
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?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-18 12:11:25

演示paste0方法。

代码语言:javascript
复制
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,你就可以做到。

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2022-09-18 12:23:57

如果内存中有一个大数据集,那么data.table快得多可能是理想的选择。类似于下面的内容可以工作,不过您需要按照实际数据集上的需要使用select_indselect_ctr

如果可能的话,给我们举个稍微大一点的玩具例子也许是值得的。

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73762276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档