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