根据列名在多个列上使用ifelse语句

时间:2017-03-03 18:29:21

标签: r

我有数据集,包含原始数据和百分比列;一些百分比最终超过100.我想使用ifelse语句将任何大于100的数字转换为100.但是,我只想将ifelse语句应用于具有字母的列" PCT"以他们的名义。

以下是一个例子:

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)))

然后将其重新绑定回原始数据集。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

我们可以使用pmin。创建具有&#39; PCT&#39;的列的索引。在他们的列名称中(&#39; j1&#39;),对数据集进行子集化,遍历列(lapply(...)并使用100获取列的pmin并将其分配回子集数据集

j1 <- grep("PCT", names(bubba))
bubba[j1] <- lapply(bubba[j1], pmin, 100)

pmin将向量作为参数。如果一个向量的长度为1,则将其再循环到较长向量的长度,并返回给出平行最小向量的向量。这里,pmin将每列作为一个参数,第二列作为100。

答案 1 :(得分:2)

这是一种更直接的方式,而不使用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