2017-04-06 46 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