2017-04-06 56 views
0

這最可能是一個非常基本的問題,但我有點卡住了。我有數據框(稱爲B)這樣R - 操縱數據幀而不丟失列

mgrno AAPL BRK MSFT WYNN 
    0001 0 0 1 2 
    0003 1 0 3 0 
    0004 0 1 0 2 

我希望做的是更換任何大於1的值與1即結果會是什麼樣子

mgrno AAPL BRK MSFT WYNN 
    0001 0 0 1 1 
    0003 1 0 1 0 
    0004 0 1 0 1 

這樣我就可以得到這個由有這個

B <- as.data.frame(ifelse(B[,-1] == 0, 0, 1)) 

,但我失去了MGRNO列,以便把碎片重新走到一起,我需要做的是這樣

temp <-B[1] 
B <- as.data.frame(ifelse(B[,-1] == 0, 0, 1)) 
B <- cbind(temp, B) 

必須有一個更好的方法。對這兩件事情都很抱歉。

回答

0

我們可以轉換成一個邏輯矩陣的數據集的一個子集(不包括第一列)和轉換邏輯,以二進制與+併爲其分配回數據集

df1[-1] <- +(df1[-1] > 0) 

或者更快方法是

df1[-1] <- lapply(df1[-1], function(x) as.integer(x > 0)) 
+1

短而甜 - 我希望我所有的代碼都可以這麼簡單 –

1

B[,-1]<-ifelse(B[,-1] == 0, 0, 1)應該這樣做。

+0

短而甜 - 我希望我所有的代碼都可以這麼簡單 –

0

如果您想要在您的數據框/矩陣的所有單元格中映射像max(x,1)這樣的函數,以下是我曾經使用過的一個技巧。 但我確定有更好的方法。

B = data.frame(mgrno = c("001", "002", "003"), 
      AAPL = c(0,1,0), 
      BRK = c(0,0,1), 
      MSFT = c(1,3,0), 
      WYNN = c(2,0,2)) 

out = sapply(B[2:5], function(x) lapply(x, function(z) min(z,1))) 
df = data.frame(B[,"mgrno"],out) 
df 

第一列的名稱有點偏離,但這是一個更微不足道的問題。

> df 
    B....mgrno.. AAPL BRK MSFT WYNN 
1   001 0 0 1 1 
2   002 1 0 1 0 
3   003 0 1 0 1