我有一个大型数据框,其中的值位于不同的列中。我还有一个名称向量(“prover”),我想对其进行迭代,扫描数据框中的一行(“Analys”)以查找匹配值。然后,我想要选择高于或低于某个值的值,并将 1 或 0 附加到一组新向量,以我的“名称向量”中的名称命名。
我尝试了下面的变体,使用paste或paste0,但得到了不同的错误代码。我在这里发现了类似的问题,但没有得到我尝试过的任何东西。我也尝试过 lapply (不带 for 循环),但出现以下错误:“条件长度 > 1 并且仅使用第一个元素”。
for (i in 1:length(prover)){
if (larm_age$Analys == prover[i]){
if (larm_age$Ålder >= 18){
if (larm_age$Res <= ngräns_v || larm_age$Res >= ögräns_v){
paste(prover[i], sep="") <- 1
}else{
paste(prover[i], sep="") <- 0
}
}else if (larm_age$Ålder <= 18 && larm_age$Ålder >= 0.1){
if (larm_age$Res <= ngräns_b || larm_age$Res >= ögräns_b){
paste(prover[i], sep="") <- 1
}else{
paste(prover[i], sep="") <- 0
}
}else if (larm_age$Ålder <= 0.1){
if (larm_age$Res <= ngräns_s || larm_age$Res >= ögräns_s){
paste(prover[i], sep="") <- 1
}else{
paste0(prover[i], sep="") <- 0
}
}
}
}
我做错了什么?我知道某个地方可能有一个函数可以以比我想要做的简单得多的方式完成此操作。
所以,我从你的问题中了解到:
您有一个专栏
analys
和一个专栏 alder
。
让 analys
具有值 a
、b
和 c
。
我根据我假设您想要实现的目标,为您创建了一些简化的示例数据。
我认为您正在尝试对
alder
变量进行分类。然后你想分析analys
中哪些年龄段有什么样的匹配。
我省略了 res
变量,因为它只是添加另一个测试层。
计算成本低廉,因此无需仅计算
analys
中匹配的类别。设置 category
变量。然后测试 analys
与 prover
的匹配。如果 prover
很大的话,我的测试方式可能不是理想的解决方案。
我认为您希望将其作为准备工作,以便事后进行另一项分析,并再次得出
prover
匹配的不同组合的结论(在本例中由 test_... 列中的 0
和 1
表示)和categories
。您也可以使用 case_when()
来实现此目的。
如果您与我们分享最低限度的代表,加上所需的输出,那么解决您的问题会更容易:)
与此同时,我正在寻找一种解决方案来自动化
prover
测试,而无需 for
循环。
library(dplyr)
df <- tibble(analys = rep(c("a", "b", "c"), times = 3),
alder = c(1, 5, 18, 20, 45, 23, 0.05, 0, 0.1),
id = 1:9)
df |>
mutate(category = case_when(alder < 18 & alder >= 0.1 ~ "child",
alder >= 18 ~ "grownup",
alder < 0.1 ~ "newborn"),
test_a = case_when(analys == "a" ~ 1,
.default = 0),
test_b = case_when(analys == "b" ~ 1,
.default = 0))
结果:
analys alder category test_a test_b
<chr> <dbl> <chr> <dbl> <dbl>
1 a 1 child 1 0
2 b 5 child 0 1
3 c 18 grownup 0 0
4 a 20 grownup 1 0
5 b 45 grownup 0 1
6 c 23 grownup 0 0
7 a 0.05 newborn 1 0
8 b 0 newborn 0 1
9 c 0.1 child 0 0