我正在尝试将长数据帧转换为广泛和标记的情况。我转动它并使用一个临时矢量作为标志。它适用于小型数据集:请参阅示例(复制并粘贴到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)
#============
答案 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循环和其他临时变量,但速度并不慢。