我有数据集,包含原始数据和百分比列;一些百分比最终超过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)))
然后将其重新绑定回原始数据集。
感谢您的帮助!
答案 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