Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中创建阈值标志_R_Tidyverse - Fatal编程技术网

在R中创建阈值标志

在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()的

我有一张看起来像上面的桌子。我想在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()
的方法,但我找不到解决方案。

如果您的“表”实际上是一个包含除第一列为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))