R编程:替换多列

时间:2017-01-19 09:48:56

标签: r data-cleaning

我是R编程的新手,并且正在完成清理数据的任务。我上传了包含多列数据的csv文件。

数据的特征基本上是是/否,但它编码为' 1'' 2',' 3',' 4&#39 ;。实际上' 2',' 3',' 4'没有任何意义,因为该值仅表明其是或否(如果有值> 0是,没有值是否)

以下是列

中数据摘要的示例
summary(data$P_FandB)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
      1       1       1       1       1       1      54 
summary(data$P_ITMobile)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
      2       2       2       2       2       2     362 
summary(data$P_Electronic)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
      3       3       3       3       3       3     420 
summary(data$P_Furniture)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
      4       4       4       4       4       4     432

我想替换数据集中这些选择性列的值2,3,4,其中1和0表示NA。请注意,还有其他代码为1,2,3,4的列,但这些代码在数据集中具有含义。

这就是我在R编程中所做的将2,3,4值替换为1;

data$P_FandB[which(data$P_FandB>1)]=1
data$P_ITMobile[which(data$P_ITMobile>1)]=1
data$P_Electronic[which(data$P_Electronic>1)]=1
data$P_Furniture[which(data$P_Furniture>1)]=1

我确实有100个变量要转换为1和NA。

您能帮我建议一下清理这些数据的最佳方法吗?

非常感谢你。

2 个答案:

答案 0 :(得分:0)

我们可以使用lapply循环选定的列,并将值分别替换为非NA和NA的1和0

selCols <- c("P_FandB", "P_ITMobile", "P_Electronic", "P_Furniture")

或者使用列索引,然后将输出分配回感兴趣的列。

data[selCols] <- lapply(data[selCols], function(x) as.integer(!is.na(NA)))

或者没有任何循环,将具有所选列的数据集转换为逻辑矩阵,将其强制转换为二进制(+),并将其分配回选定的列。

data[selCols] <- +(!is.na(data[selCols]))

或者更快的选项是data.table。转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(data)),在.SDcols中指定感兴趣的列,循环遍历data.table(.SD)的子集,替换第一个解决方案中的值,然后分配({{ 1}})它回到感兴趣的列

:=

答案 1 :(得分:0)

我们可以使用lapply()循环变量,并使用嵌套的ifelse()NA转换为0,将> 1值转换为1

创建变量名称的向量(在@ akrun的答案中查看selCols)或只在数据集中使用它们的列位置。

data[2:101] <- lapply(data[2:101], function(x) ifelse(is.na(x), 0, ifelse(x > 1, 1, 1)))

小例子:

data <- data.frame(x = c(1,2,3,4), y = c(1, NA, 3, 4))

  x  y
1 1  1
2 2 NA
3 3  3
4 4  4

data[1:2] <- lapply(data[1:2], function(x) ifelse(is.na(x), 0, ifelse(x > 1, 1, 1)))

  x y
1 1 1
2 1 0
3 1 1
4 1 1