2017-03-03 113 views
0

我擁有包含原始數字和百分比列的數據集;有些百分比最終超過了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))) 

而且然後將其綁定回原始數據集。

感謝您的幫助!

回答

2

我們可以使用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

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