【问题标题】:interchanging values after comparing two columns in R比较 R 中的两列后交换值
【发布时间】:2014-08-13 02:11:09
【问题描述】:

我想编写一个代码来检查数据框中的两列并进行比较。一个应该有下限,另一个应该有上限。如果上限列上的值小于下限,它们应该交换值。如果下限和上限都为零,则应将上限列替换为值 2。示例数据如下:

lower_limit upper_limit
0   3
0   4
5   2
0   15
0   0
0   0
7   4
8   2

运行代码后,它应该会产生类似

lower_limit upper_limit
0   3
0   4
2   5
0   15
0   2
0   2
4   7
2   8

【问题讨论】:

    标签: r


    【解决方案1】:
    dfrm <- read.table(text="lower_limit upper_limit
     0   3
     0   4
     5   2
     0   15
     0   0
     0   0
     7   4
     8   2", header=TRUE)
    
    dfrm2 <- dfrm
     dfrm2[,2] <- pmax(dfrm[,1], dfrm[,2] )
     dfrm2[,1] <- pmin(dfrm[,1], dfrm[,2] );
    dfrm2[abs(pmax(dfrm[,1],dfrm[,2]))==0 , 2] <- 2
    
    > dfrm2
      lower_limit upper_limit
    1           0           3
    2           0           4
    3           2           5
    4           0          15
    5           0           2
    6           0           2
    7           4           7
    8           2           8
    

    【讨论】:

    • 显然很干净,但我认为第 5 行和第 6 行应该是 upper_limit 的 2。
    • @DWin 但这仅回答了问题的第一部分:)
    • 是的。注意到那个。固定。
    • DWin,我正在使用你的代码,当两列都为零时它不会替换 2
    • 在开始新的会话后它(仍然)对我有用。添加代码以创建dfrm 的可重现版本。
    【解决方案2】:

    假设dat 是您的数据框/矩阵的名称:

    setNames(as.data.frame(t(apply(dat, 1, function(x) { 
                                             tmp <- sort(x);
                                             tmp[2] <- tmp[2] + (!any(x)) * 2; 
                                             return(tmp) }))), colnames(dat))
      lower_limit upper_limit
    1           0           3
    2           0           4
    3           2           5
    4           0          15
    5           0           2
    6           0           2
    7           4           7
    8           2           8
    

    它是如何工作的?

    函数apply用于对每一行应用一个函数(参数1)。在这个函数中,x 代表一行dat。首先,将值排序(使用sort)并存储在对象tmp 中。然后,如果两个值都是0,则将tmp 的第二个值替换为2。最后,返回tmp。函数apply 将结果作为矩阵返回,需要转置(使用t)。这个矩阵被转换成一个数据框(as.data.frame),其列名与原始对象dat(带有setNames)相同。

    【讨论】:

    • 我想了解你的函数在做什么,请你解释一下。
    • @jonestats 我添加了解释。
    • 看过了,非常感谢。
    • 我有 16 个具有相似列名的数据集,想替换所有数据集的上限和下限,是否可以使用循环来执行此操作?
    • @jonestats 您应该使用示例数据创建一个新问题。我想您可以将lapply 与我的答案中的函数一起使用。
    猜你喜欢
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多