1

我正在尝试将长数据框转换为宽且带有标记的案例。我旋转它并使用一个临时向量作为标志。它在小型数据集上完美运行:请参阅示例(复制并粘贴到您的 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)
#============
4

2 回答 2

0

Spread 只能在与价差“键”和其余数据(在流失示例中为 account_length、area_code 和 international_plan)相交的“单元格”中放置一个唯一值。所以真正的问题是如何管理这些重复的条目。答案取决于您要做什么。我在下面提供了一种可能的解决方案。我没有制作一个虚拟的“临时”变量,而是计算剧集的数量并将其用作虚拟变量。这可以使用 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)

传播现在有效。

于 2017-05-12T05:13:20.020 回答
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')

虽然你可能会在函数内部看到一个 for 循环和其他临时变量f,但速度确实不慢。

于 2017-05-12T05:55:16.233 回答