R - 在不丢失列的情况下处理数据帧

时间:2017-04-06 15:15:30

标签: r dataframe cbind

这最可能是一个非常基本的问题,但我有点卡住了。我有像这样的数据框(称为B)

   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)

必须有一个更简洁的方式。抱歉这两个人都有这个基本的东西。

3 个答案:

答案 0 :(得分:1)

B[,-1]<-ifelse(B[,-1] == 0, 0, 1)应该这样做。

答案 1 :(得分:0)

我们可以转换为数据集子集(不包括第一列)的逻辑矩阵,并将逻辑转换为二进制+并将其分配回数据集

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

或者更快的方法是

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

答案 2 :(得分:0)

如果要在数据框/矩阵的所有单元格中映射self.之类的函数,这是我以前使用的技巧。 不过我确信有更好的方法。

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