gpt4 book ai didi

varnames 上的重复函数

转载 作者:行者123 更新时间:2023-12-04 15:23:30 25 4
gpt4 key购买 nike

使用以下数据框(类似于我的数据,但小得多):

id <- c(1:10)
clo_a <- c(rep(c("Yes","No"), 5))
clo_f <- c(rep(c(4,5), 5))
man_a <- c(rep(c("Yes","No"), each = 5))
man_f <- c(rep(c(c(3,7)), each = 5))
pho_a <- c(rep(c(NA, NA, "Yes", NA, "No"), 2))
pho_f <- c(rep(c(1,2,3,4,5), 2))

ds <- data.frame(id, clo_a, clo_f, man_a, man_f, pho_a, pho_f)

生成数据帧 ds 如下:

   id clo_a clo_f man_a man_f pho_a pho_f
1 1 Yes 4 Yes 3 <NA> 1
2 2 No 5 Yes 3 <NA> 2
3 3 Yes 4 Yes 3 Yes 3
4 4 No 5 Yes 3 <NA> 4
5 5 Yes 4 Yes 3 No 5
6 6 No 5 No 7 <NA> 1
7 7 Yes 4 No 7 <NA> 2
8 8 No 5 No 7 Yes 3
9 9 Yes 4 No 7 <NA> 4
10 10 No 5 No 7 No 5

我现在想用"is"选择以 _a 结尾的变量的 ID,以及以 _f 结尾的变量的值,尽管理想情况下是分开的。

举个例子,我可以这样写:

upset_clo_a <- ds$id[which( ds$clo_a == "Yes")]

制作:

> upset_clo_a
[1] 1 3 5 7 9

我现在想对所有变量重复此操作,理想情况下使用变量集中具有公分母的向量,例如:

ai_list <- c("clo", "man", "pro")

显然下面的例子是行不通的。我尝试了几种使用 paste()substitute() 的变体,但没有产生任何有用的东西。

lapply(ai_list, function(x) {
upset_x <- ds$id[which( ds$x == "Yes")]
})

我尝试的所有变体的输出都是相同的:

[[1]]
integer(0)

[[2]]
integer(0)

[[3]]
integer(0)

最后,我想(例如)将每个变量的 ID 向量(例如 upset_clo_f)作为向量列表读取到 upSet 图中。也许你有一个好主意。谢谢!

最佳答案

您可以将缺失的部分 (_a) 粘贴到每个向量元素中,并使用它来对您的 data.frame 进行子集化。然后遍历这些列并获取 Yes 的索引,即

sapply(ds[names(ds) %in% paste0(ai_list, '_a')], function(i)which(i == 'Yes'))

分解代码

  • paste0(ai_list, '_a') - 将后缀 [_a] 粘贴到每个名称 (clo_a, man_a, pro_a)
  • names(ds) %in% paste0(ai_list, '_a') - 返回一个逻辑向量(TRUE,FALSE),它将用于子设置感兴趣的列
  • ds[names(ds) %in% paste0(ai_list, '_a')] - 返回仅包含感兴趣列的数据框(根据上述步骤的逻辑条件)<
  • sapply(ds[names(ds) %in% paste0(ai_list, '_a')], function(i)which(i == 'Yes')) - 最后,我们循环在列上并应用 which() 函数来获取 YES
  • 的索引

关于varnames 上的重复函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62812281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com