替换数据框的非零值

时间:2018-11-01 07:44:58

标签: r dataframe

我有一个数据框,看起来像下面的示例数据。

> dput(df)
structure(list(BranchCode = structure(c(9L, 3L, 2L, 1L, 10L, 
6L, 8L, 11L, 4L, 5L, 7L), .Label = c("BU", "CA", "GT", "IN", 
"LM", "OX", "QC", "SR", "TD", "WG", "YV"), class = "factor"), 
    Requirement = c(0L, 5L, 12L, 1L, 0L, 0L, 6L, 0L, 3L, 10L, 
    0L), Availabile = c(3L, 3L, 0L, 7L, 0L, 8L, 0L, 0L, 7L, 3L, 
    6L), Alternative = c(9L, 0L, 0L, 0L, 10L, 2L, 3L, 8L, 0L, 
    0L, 5L), Complex = c(3L, 2L, 7L, 5L, 0L, 0L, 7L, 2L, 0L, 
    6L, 3L), Level1 = c(0L, 6L, 0L, 0L, 6L, 0L, 9L, 0L, 0L, 0L, 
    0L), Level2 = c(4L, 0L, 0L, 8L, 1L, 6L, 10L, 18L, 0L, 3L, 
    5L)), .Names = c("BranchCode", "Requirement", "Availabile", 
"Alternative", "Complex", "Level1", "Level2"), class = "data.frame", row.names = c(NA, 
-11L))

我需要用数字1替换所有非零值。我可以通过两种方式做到这一点。

  1. 一次替换一列,如下所示。然后,我每次都必须更改列名称。

    df$Requirement[df$Requirement != 0] <- 1

  2. 我可以编写一个基本的for循环,并根据条件通过遍历索引进行替换。

但是这两个过程都需要花费我一些时间,因为每次列或行都会增加(有时200列和20000行)。所以我想一次在整个数据帧上执行此过程。就像没有在列之间逐列替换或在数据帧上按for循环的索引进行替换一样,我需要在存在非零数值的地方用数字1替换。类似下面的内容(但不起作用)。

df[which(df[2:7] != 0)] <- 1

最终数据帧如下所示。

> df
   BranchCode Requirement Availabile Alternative Complex Level1 Level2
1          TD           0          1           1       1      0      1
2          GT           1          1           0       1      1      0
3          CA           1          0           0       1      0      0
4          BU           1          1           0       1      0      1
5          WG           0          0           1       0      1      1
6          OX           0          1           1       0      0      1
7          SR           1          0           1       1      1      1
8          YV           0          0           1       1      0      1
9          IN           1          1           0       0      0      0
10         LM           1          1           0       1      0      1
11         QC           0          1           1       1      0      1

一个解决方案或建议会很好。

3 个答案:

答案 0 :(得分:3)

你可以做

df[-1] <- as.integer(df[-1] != 0)
df
#   BranchCode Requirement Availabile Alternative Complex Level1 Level2
#1          TD           0          1           1       1      0      1
#2          GT           1          1           0       1      1      0
#3          CA           1          0           0       1      0      0
#4          BU           0          1           0       1      0      1
#5          WG           0          0           1       0      1      0
#6          OX           0          1           1       0      0      1
#7          SR           1          0           1       1      1      1
#8          YV           0          0           1       1      0      1
#9          IN           1          1           0       0      0      0
#10         LM           1          1           0       1      0      1
#11         QC           0          1           1       1      0      1

如果您有多个非数字列,并且需要先找到它们的位置,则可以

numeric_cols <- vapply(df, is.numeric, logical(1))
df[numeric_cols] <- as.integer(df[numeric_cols] != 0)
df

答案 1 :(得分:1)

df1[-1] <- + sapply(df1[-1], as.logical)

#   BranchCode Requirement Availabile Alternative Complex Level1 Level2
#1          TD           0          1           1       1      0      1
#2          GT           1          1           0       1      1      0
#3          CA           1          0           0       1      0      0
#4          BU           1          1           0       1      0      1
#5          WG           0          0           1       0      1      1
#6          OX           0          1           1       0      0      1
#7          SR           1          0           1       1      1      1
#8          YV           0          0           1       1      0      1
#9          IN           1          1           0       0      0      0
#10         LM           1          1           0       1      0      1
#11         QC           0          1           1       1      0      1

  • 使用as.ologic时,每0可获得FALSE(0)每n >= 1可获得TRUE(1)
  • 使用+会将类型强制转换为整数。

答案 2 :(得分:1)

只是先前答案的一个附加内容。

df[-1] <- as.numeric(df[-1] != 0)
df[-1] <- as.numeric(df[-1] != 0, as.logical)
df[-1] <- as.numeric(as.logical(df[-1] != 0))