enter image description here我需要遍历565列数据,每列包含与类别或金额有关的数字,并且变量的长度不同,即一列包含0-9,其中6到9是分类的和0-5是金额,相邻的列包含0-999,其中996,997,998和999是类别(无帐户,已关闭帐户等),并且只有0-992是月龄。我需要将任何“分类”数字更改为零,而只保留“值”。
我尝试遍历列和行,检查列中变量的最大长度,以确定其所在的“类别”,然后将“类别”数字更改为0。但是,当我运行时以下,它根本不会改变我的数据。我还希望能够在每列旁边添加一列,以指示变量类别,但目前已将其注释掉。
splitcode <-函数(数据){
for ( i in ncol(data)){
col <- data[,i]
max_length <- max(nchar(col))
for ( j in nrow(data)){
val <- data[j,i]
if( max_length == 1){
ifelse(val > 5, 0,val)
}
#data$attribute_type[i] <- 'Amount'
if( max_length == 2){
ifelse(val > 92, 0, val)
}
#data$attribute_type[i] <- 'Number of Accounts'
if( max_length == 3){
ifelse(val > 992, 0, val)
}
#data$attribute_type[i] <- 'Age in Months'
if( max_length == 4){
ifelse(val > 9992, 0, val)
}
#data$attribute_type[i] <- 'Age in Months'
if( max_length == 7){
ifelse( val > 9999992, 0, val)
#data$attribute_type[i] <- 'Total Balance'
}
else{
#then we know you're a percentage
ifelse(val > 1, 0, val)
#data$attribute_type[i] <- 'Percentage'
}
}
}
return(data)
}
我没有收到任何错误消息,但是返回的数据为null或不变。我希望返回的数据集是更新的0值
答案 0 :(得分:0)
欢迎使用StackOverflow。
由于您仅提供数据图片,因此其他人很难看到实际情况。但是,鉴于您要使用的数据是实数(双精度或整数而不是因子或字符),那么您的代码就可以工作-您唯一要做的就是将其分配给对象,例如数据。框架。
您遍历了数据,但是您对输出不执行任何操作。例如,您可以不用写ifelse(val > 1, 0, val)
来写
data[j,i] <- ifelse(data[j,i] > 1, 0, data[j,i])
。这里重要的是赋值运算符<-
。
但是,以这种方式更改数据不太像R。通常,使用ifelse
之类的矢量化函数时,仅在列上工作就足够了。
以下是解决您的问题的dplyr解决方案。
# load the package
library("dplyr")
# some test data, a column with max(nchar(x)==2
test_tbl <- tibble( a = c(0,0,1,99,3,4,99))
test_tbl <- test_tbl %>% # overwrite test data the following way
# mutate (change) a column, if it has max 2 charaters
mutate_if(~ max(nchar(.x))==2,
# sql-like case_when corresponds to your ifelse-statements
~ case_when(.x > 92 ~ 0,
TRUE ~ .x)
) # closes mutate_if
希望这对您的数据有用!