我是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。
您能帮我建议一下清理这些数据的最佳方法吗?
非常感谢你。
答案 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