分配给data.frame

时间:2016-01-25 03:15:47

标签: r

我依靠矢量回收利用模拟数据填充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相同长度的向量的情况下取得成功?

1 个答案:

答案 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