基于列名在多个列上使用ifelse语句
问题描述:
我拥有包含原始数字和百分比列的数据集;有些百分比最终超过了100.我想使用ifelse语句将大于100的任何数字转换为100.但是,我只希望将ifelse语句应用于包含字母“PCT”的列他们的名字。基于列名在多个列上使用ifelse语句
下面是一个例子:
a <- c(4,6,1210,20, 603, 50)
b <- c(50,60,10,400,311, 40)
bubba <- data.frame(A_NUM=a,
A_PCT=b)
我想最终的格式为:
a <- c(4,6,1210,20, 603, 50)
b <- c(50,60,10,100,100, 40)
bubba_fixed <- data.frame(A_NUM=a,
A_PCT=b)
我已经得到最接近的是这样的:
bubba <- bubba [ , grepl("PCT" , names(bubba)) ]
bubba <- as.data.frame(lapply(bubba, function(x) ifelse(x > 100, 100, x)))
而且然后将其绑定回原始数据集。
感谢您的帮助!
答
我们可以使用pmin
。创建列名称中具有“PCT”('j1')的列的索引,对数据集进行子集合,遍历列(lapply(...
)并获取100列的pmin
,并将其分配回数据集的子集
j1 <- grep("PCT", names(bubba))
bubba[j1] <- lapply(bubba[j1], pmin, 100)
pmin
将向量作为参数。如果一个向量的长度为1,则将其循环到较长向量的长度,并返回一个向量,该向量给出并行最小向量。在此,取pmin
每个列作为第一参数和第二为100
答
这是不使用lapply
更直接的方式:
pct = grepl("PCT" , names(bubba))
bubba[, pct][ bubba[, pct] > 100 ] = 100
例如: 应用上面
两条线a <- c(4,6,1210,20, 603, 50)
b <- c(50,60,10,400,311, 40)
bubba <- data.frame(A_NUM=a,
A_PCT=b, B_num = a, B_PCT = b+10)
> bubba
A_NUM A_PCT B_num B_PCT
1 4 50 4 60
2 6 60 6 70
3 1210 10 1210 20
4 20 400 20 410
5 603 311 603 321
6 50 40 50 50
结果:
> bubba
A_NUM A_PCT B_num B_PCT
1 4 50 4 60
2 6 60 6 70
3 1210 10 1210 20
4 20 100 20 100
5 603 100 603 100
6 50 40 50 50
五月值得澄清为什么这样更好:'pmin(x,y)'是计算'ifelse(x> y,y,x)'更有效的方法',并且它还使您不必每次写入两次。 – Frank