在比较R中的两列之后交换值

时间:2013-02-18 18:11:43

标签: r

我想编写一个代码来检查数据框中的两列并进行比较。一个应该有下限和其他上限。如果上限列上的值小于下限值,则它们应该交换值。如果下限和上限均为零,则应使用值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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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中。然后,如果两个值均为tmp,则2的第二个值将替换为0。最后,返回tmp。函数apply将结果返回为矩阵,需要对其进行转置(使用t)。此矩阵将转换为数据框(as.data.frame),其列名与原始对象datsetNames)相同。