我有一个叫做tt的数据帧.我想创建一个名为"种族"的新列,我想为超过80%的每一行值创建一个列标题.如果没有一行的值大于80%,那么我希望在该行中使用字符串"MIX".

tt <- structure(list(INDIVIDUAL = c("SJL0253301", "SJL1073801", "SJL1066401", 
"SJL1762813"), EUR = c(0.974378, 0.496489, 1e-05, 1e-05), EAS = c(0.010592, 
0.438799, 0.99996, 1e-05), AMR = c(0.004699, 1e-05, 1e-05, 0.99996
), SAS = c(1e-05, 0.053618, 1e-05, 1e-05), AFR = c(0.010321, 
0.011084, 1e-05, 1e-05)), row.names = c(1L, 44L, 19L, 911L), class = "data.frame")

我想要的结果是:

INDIVIDUAL      EUR      EAS      AMR      SAS      AFR Ethnicity
SJL0253301 0.974378 0.010592 0.004699 0.000010 0.010321 EUR
SJL1073801 0.496489 0.438799 0.000010 0.053618 0.011084 MIX
SJL1066401 0.000010 0.999960 0.000010 0.000010 0.000010 EAS
SJL1762813 0.000010 0.000010 0.999960 0.000010 0.000010 AMR

推荐答案

我们可以使用max.col返 echo 示值大于0.8的first列索引(对于每行),然后在没有索引的情况下将MIX指定给"MIX"

tt$Ethnicity <- names(tt)[-1][max.col(tt[-1] > 0.8, "first")]
tt$Ethnicity[!rowSums(tt[2:6] > 0.8)] <- "MIX"

-输出

> tt
    INDIVIDUAL      EUR      EAS      AMR      SAS      AFR Ethnicity
1   SJL0253301 0.974378 0.010592 0.004699 0.000010 0.010321       EUR
44  SJL1073801 0.496489 0.438799 0.000010 0.053618 0.011084       MIX
19  SJL1066401 0.000010 0.999960 0.000010 0.000010 0.000010       EAS
911 SJL1762813 0.000010 0.000010 0.999960 0.000010 0.000010       AMR

R相关问答推荐

如何在区分不同条件的同时可视化跨时间的连续变量?

如何自定义3D散点图的图例顺序?

在ggplot2中更改小提琴情节的顺序

如果可能,将数字列转换为整数,否则保留为数字

R -使用矩阵reshape 列表

在gggraph中显示来自不同数据帧的单个值

为什么在写入CSV文件时Purrr::Pwalk不起作用

R中时间间隔的大向量与参考时间间隔的相交

如何阻止围堵地理密度图?

注释不会绘制在所有ggplot2面上

使用同一行中的前一个值填充R矩阵中的缺失值

有没有办法更改ggplot2中第二个y轴的比例限制?

从多行中 Select 最小值

向量化sApply函数

R:统计行值在其他行值范围内的实例

不区分大小写地判断裸表达式

如何在Rmarkdown中保存绘图?

删除多列中带有NA的行

如何修复STAT_POLY_EQ中的坡度计算?

`as.trans()`中的ggplot2 ggallin错误:!`Trans`必须是字符向量或转换器对象