我正在尝试将矢量列表(本质上是一个多维数组)转换为数据帧,但每次尝试我都会得到意想不到的结果.
我的目标是实例化一个空白列表,在for循环中填充它,其中包含有关循环迭代的信息的向量,然后在完成后将其转换为数据帧.
> vectorList <- list()
> for(i in 1:5){
+ vectorList[[i]] <- c("number" = i, "square root" = sqrt(i))
+ }
> vectorList
Run Code Online (Sandbox Code Playgroud)
输出:
> [[1]]
> number square root
> 1 1
>
> [[2]]
> number square root
> 2.000000 1.414214
>
> [[3]]
> number square root
> 3.000000 1.732051
>
> [[4]]
> number square root
> 4 2
>
> [[5]]
> number square root
> 5.000000 2.236068
Run Code Online (Sandbox Code Playgroud)
现在我希望这成为一个包含2个变量的5个观测值的数据框,但是试图从'vectorList'创建一个数据框
numbers <- data.frame(vectorList)
Run Code Online (Sandbox Code Playgroud)
结果是5个变量的2个观察结果.
奇怪的是它甚至不会被重塑(我知道这将是一个糟糕的工作,但我尝试过). …
我需要编写一个函数来计算工作日的数量(减去周末,以及其他本地银行假期的向量),但是我所遇到的问题仅通过计算工作日的数量就可以更简单地说明。
这是一个给出两个日期之间的工作日数的函数:
removeWeekends <- function(end, start){
range <- as.Date(start:end, "1970-01-01")
range<- range[sapply(range, function(x){
if(!chron::is.weekend(x)){
return(TRUE)
}else{
return(FALSE)
}
})]
return(NROW(range))
}
Run Code Online (Sandbox Code Playgroud)
当给每个参数一个日期时,该方法有效:
removeWeekends(as.Date("2018-05-08"), as.Date("2018-06-08"))
#[1] 24
Run Code Online (Sandbox Code Playgroud)
但是,当它从数据帧中获得两个向量时,它将失败:
one <- as.Date("2017-01-01"):as.Date("2017-01-08")
two <- as.Date("2018-06-08"):as.Date("2018-06-15")
df <- data.frame(one, two)
removeWeekends(df$two, df$one)
#[1] 375
#Warning messages:
#1: In start:end : numerical expression has 8 elements: only the first used
#2: In start:end : numerical expression has 8 elements: only the first used
Run Code Online (Sandbox Code Playgroud)
我也试过了(我猜这不会起作用,因为语法似乎不正确):
lapply(df, removeWeekends, df$two, df$one)
#Error in FUN(X[[i]], ...) : unused …Run Code Online (Sandbox Code Playgroud) 当涉及到输出表格时,我正在将统计分析脚本从 SPSS 转换为 R,尽管我不断遇到问题。我最近开始使用 tidyverse 包,因此理想地希望找到一个与之兼容的解决方案,但更一般地说,如果有这样的事情,我希望有人指出对R进行一些深入的表培训。
无论如何......这是我想要复制的表格布局:
本质上它是一个频率
这是一些示例数据的一些脚本:
i <- c(201:301)
ID <- sample(i, 200, replace=TRUE)
i <- 1:2
Category1 <- sample(i, 200, replace=TRUE)
Category2 <- sample(i, 200, replace=TRUE)
Category3 <- sample(i, 200, replace=TRUE)
df <- data.frame(ID, Category1, Category2, Category3)
Run Code Online (Sandbox Code Playgroud)
现在我已经尝试过这个:
IDTab <- df %>%
mutate(ID = as.character(ID)) %>%
group_by(ID) %>%
summarise(C1_1 = NROW(Category1[which(Category1 == 1)])
,C1_2 = NROW(Category1[which(Category1 == 2)])
,C1_T = NROW(Category1)
,C2_1 = NROW(Category2[which(Category2 == 1)])
,C2_2 = NROW(Category2[which(Category2 == 2)])
,C2_T = NROW(Category2)
,C3_1 …Run Code Online (Sandbox Code Playgroud)