我依靠矢量回收利用模拟数据填充R数据帧,但行为与期望不符。
我可以成功地运行它:
store.df <- data.frame(matrix(NA, ncol=5, nrow=2080))
names(store.df)<-c("storeNum", "upc_id", "Week_id", "weekday_id", "units")
sn<-c(60, 89, 105, 170, 1240)
store.df$storeNum <- sn
wid<-c(201531,201532,201533,201534,201535,201536,201537,201538)
store.df$Week_id <- wid
实现这一目标:
summary(store.df)
storeNum upc_id Week_id weekday_id units
Min. : 60.0 Mode:logical Min. :201531 Mode:logical Mode:logical
1st Qu.: 89.0 NA's:2080 1st Qu.:201533 NA's:2080 NA's:2080
Median : 105.0 Median :201535
Mean : 332.8 Mean :201535
3rd Qu.: 170.0 3rd Qu.:201536
Max. :1240.0 Max. :201538
但是,如果我在这里看到最后两行:
store.df <- data.frame(matrix(NA, ncol=5, nrow=2080))
names(store.df)<-c("storeNum", "upc_id", "Week_id", "weekday_id", "units")
sn<-c(60, 89, 105, 170, 1240)
store.df$storeNum <- sn
wid<-c(201531,201532,201533,201534,201535,201536,201537,201538)
store.df$Week_id <- wid
wdid<-c(1,2,3,4,5,6,7)
store.df$weekday_id <- wdid
然后我收到了这个错误:
wdid<-c(1,2,3,4,5,6,7)
store.df$weekday_id <- wdid
Error in `$<-.data.frame`(`*tmp*`, "weekday_id", value = c(1, 2, 3, 4, :
replacement has 7 rows, data has 2080
为什么我不能将wdid
向量回收到store.df
并取得与前两个语句(store.df$storeNum <- sn
&amp; store.df$Week_id <- wid
)相同的成功?
是否可以在不将wdid
转换为与store.df
相同长度的向量的情况下取得成功?
答案 0 :(得分:3)
这是因为2000不能被7整除。部分回收不适用于数据框列:
d <- data.frame(x=1:10)
d$x <- 1
d$x <- 1:2
d$x <- 1:3
# Error in `$<-.data.frame`(`*tmp*`, "x", value = 1:3) :
# replacement has 3 rows, data has 10
从相关的帮助文本?[<-.data.frame
,在参数部分:
&#34; value
:一个合适的替代值:如有必要,它将重复整个次数&#34;
部分回收适用于矢量:
x <- d$x
x[] <- 1:3
# Warning message:
# In x[] <- 1:3 :
# number of items to replace is not a multiple of replacement length
x
# [1] 1 2 3 1 2 3 1 2 3 1
您可以类似地对数据框进行分配(如果您确定它是您想要做的):
d$x[] <- 1:3
# Warning message:
# In d$x[] <- 1:3 :
# number of items to replace is not a multiple of replacement length
d
# x
# 1 1
# 2 2
# 3 3
# 4 1
# 5 2
# 6 3
# 7 1
# 8 2
# 9 3
# 10 1