如何使用spread()重塑数据框时解决错误

时间:2017-05-12 02:59:18

标签: r machine-learning tidyr spread

我正在尝试将长数据帧转换为广泛和标记的情况。我转动它并使用一个临时矢量作为标志。它适用于小型数据集:请参阅示例(复制并粘贴到Rstudio中),但当我尝试在实际数据上执行此操作时,它会报告错误:

  

churnTrain3< - spread(churnTrain,key =" state",value =" temporary",fill = 0)   错误:行(169,249),(57,109),(11,226)

的重复标识符

结构范围的数据集与进一步处理相关 有没有解决这个问题的方法。我打赌很多人都试图清理数据并解决同样的问题。 请帮我 这是代码: 第一个块"示例"制作小型数据集以实现良好的可视化效果 第二块"真实数据"是从流失库

的切片部分数据集
library(caret)
library(tidyr)

#example
#============
df <- data.frame(var1 = (1:6),
             var2 = (7:12),
             factors = c("facto1", "facto2", "facto3", "facto3","facto5", "facto1") ,
             flags = c(1, 1, 1, 1, 1, 1)) 
 df

 df2 <- spread(data = df, key = "factors" , value = flags, fill = " ")
 df2
#=============

# real data
#============
 data(churn)

 str(churnTrain)
 churnTrain <- churnTrain[1:250,1:4]
 churnTrain$temporary <-1
 churnTrain3 <- spread(churnTrain, key = "state", value = "temporary", fill = 0)

 str(churnTrain)
 head(churnTrain3)
 str(churnTrain3)
#============

2 个答案:

答案 0 :(得分:0)

点差只能在&#39;单元格中放入一个唯一值。与传播键相交的键#39;和其余数据(在流失示例中,account_length,area_code和international_plan)。所以真正的问题是如何管理这些重复的条目。答案取决于你想要做什么。我在下面提供一种可能的解决方而不是制作一个假的临时&#39;变量,我改为计算剧集的数量并将其用作虚拟变量。这可以通过dplyr非常轻松地完成:

library(tidyr)
library(dplyr)    
library(C50) # this is one source for the churn data

data(churn)

churnTrain <- churnTrain[1:250,1:4]

churnTrain2 <- churnTrain %>%
    group_by(state, account_length, area_code, international_plan) %>%
    tally %>%
    dplyr::rename(temporary = n)

churnTrain3 <- spread(churnTrain2, key = "state", value = "temporary", fill = 0)

Spread现在有效。

答案 1 :(得分:0)

正如其他人指出的那样,您需要在spread中输入一个唯一的向量。我的解决方案是使用base R:

library(C50)

f<- function(df, key){
  if (sum(names(df)==key)==0) stop("No such key");
  u <- unique(df[[key]])
  id <- matrix(0,dim(df)[1],length(u))
  uu <- lapply(df[[key]],function(x)which(u==x)) ## check 43697442 for details
  for(i in 1:dim(df)[1]) id[i,uu[[i]]] <- 1
  colnames(id) = as.character(u)
  return(cbind(df,id));

}

df <- data.frame(var1 = (1:6),
                 var2 = (7:12),
                 factors = c("facto1", "facto2", "facto3", "facto3","facto5", "facto1"))
f(df, key='fact')
f(df, key='factors')

data(churn)
churnTrain <- churnTrain[1:250,1:4]
f(churnTrain, key='state')

虽然您可能会在f函数中看到for循环和其他临时变量,但速度并不慢。