在某些圈子中,一个相当常见的数据问题是对一种仪器进行编码,例如这一种,其中相关的项目在仪器中分开。这样做的目的是避免提醒被访者,所有这些问题--比如说,本例中所有以A或D开头的问题--都是相关的。
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。
如果您将变量编号放入代码中,这是非常简单的。
Data %>% select(2,5,6) %>% names()这可不太普遍。我有一个案例,我有70个变量,8个分量表,每个分量表有4到8个变量,总分有40个变量。我想从文件中读取列号,但看不出有什么办法,然后把它们拿出来。
Scales <- c('A','B','D')
Numbers <- c('1,4,8,9','2,5,6','3,7,10')
Scale <- tibble(Scales,Numbers)我想把它们弄出来
Data %>% select(2,5,6) %>% names()很管用,但是
Data %>% select(Scale$Numbers[1]) %>% names()
Data %>% select(as.numeric(Scale$Numbers[1])) %>% names()不要,就像许多涉及现状的努力一样!等等。我知道Hadley Wickham 不赞成使用列位置和我知道为什么,但这是一个合理的用例,也许是我见过的唯一一个。
这就是我在做这个特别的研究-
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个子量表。这就是为什么我希望有一个程序化的解决方案。
欢迎提出建议!谢谢安东尼
发布于 2022-02-05 19:15:50
考虑使用命名列表。这是你想要的吗?
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"我们也可以把它变成一个搜索函数。
find <- function(x){
Data %>% select(Scale$Numbers[[x]]) %>% names()
}
find("B")
#[1] "B1" "B3" "B2"发布于 2022-02-05 20:04:32
听起来好像不管你需要创建某种类型的映射。考虑一下这种方法,创建一串属性来捕获每个问题所属的组。我使用"I“作为标识符,因为长度需要匹配列数。
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"https://stackoverflow.com/questions/71001024
复制相似问题