首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按dplyr中的索引、位置或数字识别非顺序的tibble列

按dplyr中的索引、位置或数字识别非顺序的tibble列
EN

Stack Overflow用户
提问于 2022-02-05 18:39:24
回答 2查看 38关注 0票数 1

在某些圈子中,一个相当常见的数据问题是对一种仪器进行编码,例如这一种,其中相关的项目在仪器中分开。这样做的目的是避免提醒被访者,所有这些问题--比如说,本例中所有以A或D开头的问题--都是相关的。

代码语言:javascript
复制
rm(list=ls())
Column_Names = c('A2','B1','D1','A1','B3','B2','D3','A3','A4','D2')
Matrix <- matrix(nrow=10,ncol=10,floor(runif(n=100,min=0, max=10)))
Data <- as_tibble(Matrix)
names(Data) = Column_Names
Identifier = sample(letters, size=10)
Data <- Data %>% mutate(Identifier = Identifier)
rm(Matrix, Column_Names, Identifier)

对这些工具进行评分通常要求您拿出所有相关的项目(B1、B2、B2,)并对它们做一些事情。这通常是非常简单的事情--一个平均值,可能是某些项必须重新编码(0=9,1=8,2-7,3-6 .)。所有这些都很简单。通常有子尺度(A,B,C,D),它们是根据变量的固定子集计算的--例如,A1、A2、A3可能是一个子尺度,而D1、D2和D3可能是另一个子尺度。

硬位是选择列。在实际的例子中,可能有50个项目,它们应该是一个固定的顺序。(这些文书按固定顺序提供问题)。棘手的一点是,不同的调查人员会对相同的变量使用不同的名称。它们不使用像我的例子中的名称,其中每个子比例尺都有一个直接引用子尺度的名称。

只有两种明智的方法来做到这一点,并使它正确(我认为)。一种方法是将变量重命名为一组常见的名称,并对这些名称进行评分。另一种是按位置选择变量--因此,子尺度A是列1、3和8,子标度B是列2、5和6。

如果您将变量编号放入代码中,这是非常简单的。

代码语言:javascript
复制
Data %>% select(2,5,6) %>% names()

这可不太普遍。我有一个案例,我有70个变量,8个分量表,每个分量表有4到8个变量,总分有40个变量。我想从文件中读取列号,但看不出有什么办法,然后把它们拿出来。

代码语言:javascript
复制
Scales <- c('A','B','D')
Numbers <- c('1,4,8,9','2,5,6','3,7,10')
Scale <- tibble(Scales,Numbers)

我想把它们弄出来

代码语言:javascript
复制
Data %>% select(2,5,6) %>% names()

很管用,但是

代码语言:javascript
复制
    Data %>% select(Scale$Numbers[1]) %>% names()
    Data %>% select(as.numeric(Scale$Numbers[1])) %>% names()

不要,就像许多涉及现状的努力一样!等等。我知道Hadley Wickham 不赞成使用列位置和我知道为什么,但这是一个合理的用例,也许是我见过的唯一一个。

这就是我在做这个特别的研究-

代码语言:javascript
复制
Somatic <- Questionnaire1 %>%
  select(   1,7,16,32,43,
          45,50,51, Identifier) %>%
  rowwise(Identifier) %>%
  mutate(Somatic = mean(c_across(1:8),na.rm=TRUE)) %>%
  select(Identifier, Somatic)
  
Cognitive  <- Questionnaire %>%
  select( 2, 4, 8,11,15,
         21,22,23,36,42,
         46,54,59, Identifier) %>%
  rowwise(Identifier) %>%
  mutate(Cognitive = mean(c_across(1:13),na.rm=TRUE)) %>%
  select(Identifier, Cognitive)

在这个应用程序中,有9个子类和一个总分。在本研究中,使用了5种不同的仪器,有5套不同的变量,共20个子量表。这就是为什么我希望有一个程序化的解决方案。

欢迎提出建议!谢谢安东尼

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-05 19:15:50

考虑使用命名列表。这是你想要的吗?

代码语言:javascript
复制
Scales <- c('A','B','D')
Numbers = list(A = c(1,4,8,9), B = c(2,5,6), D = c(3, 7, 10))
Scale <- tibble(Scales,Numbers)
Data %>% select(Scale$Numbers$B) %>% names()
#[1] "B1" "B3" "B2"

我们也可以把它变成一个搜索函数。

代码语言:javascript
复制
find <- function(x){
    Data %>% select(Scale$Numbers[[x]]) %>% names()
}

find("B")
#[1] "B1" "B3" "B2"
票数 0
EN

Stack Overflow用户

发布于 2022-02-05 20:04:32

听起来好像不管你需要创建某种类型的映射。考虑一下这种方法,创建一串属性来捕获每个问题所属的组。我使用"I“作为标识符,因为长度需要匹配列数。

代码语言:javascript
复制
Attributes <- c("A", "B", "D", "A", "B", "B", "D", "A", "A", list(c("B", "D")), "I")
attr(Data, "Group") <- Attributes

Data %>%
    select_if(purrr::map_lgl(attr(Data, "Group"), `%in%`, x = "B")) %>% names()
#[1] "B1" "B3" "B2" "D2"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71001024

复制
相关文章

相似问题

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