0

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

2 回答 2

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
于 2013-02-18T18:24:16.447 回答
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则替换为的第二个值。最后,被退回。该函数将结果作为矩阵返回,该矩阵需要转置(使用)。该矩阵被转换为与原始对象具有相同列名的数据框 ( ) (with )。20tmpapplytas.data.framedatsetNames

于 2013-02-18T18:25:41.717 回答