基于列名在多个列上使用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

+1

五月值得澄清为什么这样更好:'pmin(x,y)'是计算'ifelse(x> y,y,x)'更有效的方法',并且它还使您不必每次写入两次。 – Frank

这是不使用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