在R中创建阈值标志
我有一张看起来像上面的桌子。我想在1值占行的90%(不包括id列)的每行做一个标记 因此,对于本例,仅标记第1行和第4行 预期产出:在R中创建阈值标志,r,tidyverse,R,Tidyverse,我有一张看起来像上面的桌子。我想在1值占行的90%(不包括id列)的每行做一个标记 因此,对于本例,仅标记第1行和第4行 预期产出: id | 85| 291| 5680| 41 ---+---+----+-----+---- 597| 1 | 1 | 1 | 1 672| 1 | 0 | 0 | 0 680| 1 | 1 | 1 | 0 683| 1 | 1 | 1 | 1 如何使用tidyverse语法在R中实现这一点?我尝试了一些处理rowSums()的
id | 85| 291| 5680| 41
---+---+----+-----+----
597| 1 | 1 | 1 | 1
672| 1 | 0 | 0 | 0
680| 1 | 1 | 1 | 0
683| 1 | 1 | 1 | 1
如何使用tidyverse语法在R中实现这一点?我尝试了一些处理rowSums()
的方法,但我找不到解决方案。如果您的“表”实际上是一个包含除第一列为1和0之外的所有列的数据帧,您可以执行以下操作:
df%>%变异(标志=应用(df[-1],1,函数(x)和(x)/长度(x)>0.9)
也许可以尝试使用行方式
:
id | 85| 291| 5680| 41 | flag |
---+---+----+-----+----+------+
597| 1 | 1 | 1 | 1 | yes |
672| 1 | 0 | 0 | 0 | no |
680| 1 | 1 | 1 | 0 | no |
683| 1 | 1 | 1 | 1 | yes |
这假设此处的值只有1和0。tidyverse中的一个选项是将形状改为“长”格式,获取
平均值
并与原始数据集绑定
df$flag = rowMeans(df[-1]) >= .9
库(dplyr)
图书馆(tidyr)
df1%>%
pivot_更长(cols=-id)%>%
分组依据(id)%>%
总结(标志=平均值(值)>0.9)%>%
右联合(df1)%>%
选择(名称(df1),所有内容())
#一个tibble:4x6
#id`85``291``5680``41`标志
#
#159711对
#2672100错误
#368010错误
#46831正确
数据
df1
library(dplyr)
library(tidyr)
df1 %>%
pivot_longer(cols = -id) %>%
group_by(id) %>%
summarise(flag = mean(value) > 0.9) %>%
right_join(df1) %>%
select(names(df1), everything())
# A tibble: 4 x 6
# id `85` `291` `5680` `41` flag
# <dbl> <dbl> <dbl> <dbl> <dbl> <lgl>
#1 597 1 1 1 1 TRUE
#2 672 1 0 0 0 FALSE
#3 680 1 1 1 0 FALSE
#4 683 1 1 1 1 TRUE
df1 <- structure(list(id = c(597, 672, 680, 683), `85` = c(1, 1, 1,
1), `291` = c(1, 0, 1, 1), `5680` = c(1, 0, 1, 1), `41` = c(1,
0, 0, 1)), class = "data.frame", row.names = c(NA, -4L))