如果您提前知道列的名称,则可以直接向xts对象添加列.例如,要添加名为"b"的列:
n <- 5
x <- merge(xts(order.by = as.Date('2015-1-1') + 1:n), a = rnorm(n))
x$b <- rnorm(n)
Run Code Online (Sandbox Code Playgroud)
添加动态命名的列(即,名称仅在运行时已知的列)更难:
new.col.name <- 'c' # known only at runtime
x[, new.col.name] <- rnorm(n) # this generates an error
Run Code Online (Sandbox Code Playgroud)
一种方法是添加具有临时名称的列,然后重命名它:
stopifnot(!('tmp' %in% names(x)))
x$tmp <- rnorm(n)
names(x)[names(x) == 'tmp'] <- new.col.name
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?(另外,分配names一个xts对象会导致正在制作的对象的副本吗?例如,如果n非常大,上述方法是否可以正常工作?)
我想将矩阵/数组(带有暗名称)转换为数据框。使用 可以很容易地完成此操作reshape2::melt,但使用 似乎更困难tidyr,并且实际上在数组的情况下实际上不可能。我错过了什么吗?(特别是因为reshape2自称已退休;请参阅https://github.com/hadley/reshape)。
例如,给定以下矩阵
MyScores <- matrix(runif(2*3), nrow = 2, ncol = 3,
dimnames = list(Month = month.name[1:2], Class = LETTERS[1:3]))
Run Code Online (Sandbox Code Playgroud)
我们可以将其转换为数据框,如下所示
reshape2::melt(MyScores, value.name = 'Score') # perfect
Run Code Online (Sandbox Code Playgroud)
或者,使用tidyr如下:
as_tibble(MyScores, rownames = 'Month') %>%
gather(Class, Score, -Month)
Run Code Online (Sandbox Code Playgroud)
在这种情况下reshape2和tidyr看起来很相似(尽管reshape2如果您正在寻找长格式数据框,则更短)。
然而对于数组来说,这似乎更困难。给定
EverybodyScores <- array(runif(2*3*5), dim = c(2,3,5),
dimnames = list(Month = month.name[1:2], Class = LETTERS[1:3], StudentID = 1:5))
Run Code Online (Sandbox Code Playgroud)
我们可以将其转换为数据框,如下所示:
reshape2::melt(EverybodyScores, value.name = 'Score') # perfect
Run Code Online (Sandbox Code Playgroud)
但使用 …
当我尝试构建一个C#控制台应用程序(可能还有其他)时,它似乎TargetFrameworkDirectories设置不正确; 特别是它省略了Facades目录.
由于我一直试图诊断问题一段时间,这里列出了可能相关的事实.
warning MSB3267: The primary reference "System.Runtime", which is a framework assembly, could not be resolved in the currently targeted framework. ".NETFramework,Version=v4.5".在msbuild执行期间发生此问题ResolveAssemblyReferenceTargetFrameworkDirectories(参数ResolveAssemblyReference)C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\,C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\Facades\但是在坏机器上它缺少第二个条目(Facades目录)扫描好的和坏的msbuild日志文件会出现以下差异:
AssignProjectConfiguration在错误的构建中跳过目标,但在良好的构建中运行GetInstalledSDKLocations好的构建中跳过了许多目标,但在构建不好的情况下没有提到ResolveAssemblyReference任务传递Assemblies用Implicit=true的好身材,但不是在恶劣的构建.ResolveAssemblyReference任务传递任务参数TargetFrameworkDirectories与C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\在恶劣的身材,但好建外立面目录(见上文)的第二项.因为这是由C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets我在好坏机器上分析该文件所驱动的.它们包含许多差异.第一个区别是项目元素(第17行),它TreatAsLocalProperty="OutDir"在良好的机器上有一个额外的属性.在良好的机器上,目标文件包含更多注释,例如<!-- VS10 without SP1 and without …
如何ggplot在垂直轴上使用对数刻度的绘图添加垂直线?
例如,
ggplot(data.frame(x=1:2, y=c(10,20)), aes(x,y)) +
geom_line() +
geom_vline(xintercept = 1.5)
Run Code Online (Sandbox Code Playgroud)
按预期工作.如果将垂直轴转换为对数刻度:
ggplot(data.frame(x=1:2, y=c(10,20)), aes(x,y)) +
geom_line() +
geom_vline(xintercept = 1.5) +
coord_trans(y = 'log')
Run Code Online (Sandbox Code Playgroud)
然后垂直线消失.也许相关的是,如果稍微更改数据:
ggplot(data.frame(x=1:2, y=c(1,20)), aes(x,y)) + # y[1] is now different
geom_line() +
geom_vline(xintercept = 1.5) +
coord_trans(y = 'log')
Run Code Online (Sandbox Code Playgroud)
然后垂直线仍然缺失,但会发出警告消息:
Warning messages:
1: In self$trans$y$transform(y) : NaNs produced
2: In trans$transform(value) : NaNs produced
Run Code Online (Sandbox Code Playgroud)
因此,可能是因为尝试记录0(-Inf和无警告)或负数(NaN和警告)而导致缺失行.
(sessionInfo()给R version 3.3.1 (2016-06-21)和ggplot2_2.2.0.)
有没有办法为summarize_at通话添加额外的统计数据?例如
iris %>% group_by(Species) %>% summarise_at(vars(), funs(mean, sd))
Run Code Online (Sandbox Code Playgroud)
将计算4列的平均值和标准偏差(总共8列).假设我也想知道每组中有多少行.就是这样的
# Below is not valid syntax
iris %>%
group_by(Species) %>%
summarise_at(vars(), funs(mean, sd)) + summarise(n())
Run Code Online (Sandbox Code Playgroud)
鉴于以上不起作用,kludge是
iris %>% group_by(Species) %>% summarise_at(vars(), funs(mean, sd, length))
Run Code Online (Sandbox Code Playgroud)
实际上,它产生4个计数列的副本.
也许这超出了summarize_at朋友可以方便处理的范围?
在 Little Typer 第 2 章中,第 100 帧给出了以下定义:
(claim pearwise+
(? Pear Pear
Pear))
(define pearwise+
(? (anjou bosc)
(elim-Pear anjou
(? (a1 d1)
(elim-Pear bosc
(? (a2 d2)
(cons
(+ a1 a2)
(+ d1 d2))))))))
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我收到以下错误:
Unknown variable +
Run Code Online (Sandbox Code Playgroud)
怎么了?
有没有tidyverse比使用更惯用的方法将多个列组合成一个列表列mapply?
例如给出以下内容
tibble(.rows = 9) %>%
mutate(foo = runif(n()),
a_1 = runif(n()),
a_2 = runif(n()),
a_3 = runif(n())) ->
Z
Run Code Online (Sandbox Code Playgroud)
(其中Z可能包含其他列,并且也可能包含超过 3 as)可以做
Z %>% mutate(A = mapply(c, a_1, a_2, a_3, SIMPLIFY = FALSE))
Run Code Online (Sandbox Code Playgroud)
效果很好,尽管能够说starts_with('a_')而不是a_1, a_2, a_3.
另一种可能性是
Z %>%
rowid_to_column() %>%
pivot_longer(cols = starts_with('a_')) %>%
group_by(rowid) %>%
summarise(foo = unique(foo),
A = list(value)) %>%
select(-rowid)
Run Code Online (Sandbox Code Playgroud)
这在技术上是可行的,但引入了其他问题(例如,它使用了一个丑陋的foo = unique(foo);此外,如果不是只有一个而是foo有很多foos ,它会变得更加复杂)。
假设我有一个用C#编写的字典。假设键具有可比性,我如何找到大于给定k(与字典键的类型相同)的最小键?但是,我想通过SortedDictionary这样的集合有效地做到这一点。
显然,如果不是高效地执行操作的问题,则可以从任何字典开始,提取其键,然后使用带有合适谓词的First方法。但这将在线性时间(按键的数量)中执行,如果一个键具有一组排序的键,则一个人应该能够在记录时间内找到该键。
谢谢。
在《The Little Typer》一书中,我刚刚开始使用DrRacket。从 David Christiansen 的视频中,我输入了:
(claim two-plus-two-is-four
(= Nat (+ 2 2) 4))
Run Code Online (Sandbox Code Playgroud)
返回错误:
claim : this function is not defined.
Run Code Online (Sandbox Code Playgroud)
为什么?
我正在观察一些gganimate我无法解释的行为,我想了解我做错了什么(或者它是否是一个错误)。
例如,这是一个非常简单的数据集及其绘图:
library(dplyr) # dplyr_0.7.8
library(tidyr) # tidyr_0.8.2
crossing(p = 1:2,
t = seq(0, 1, len = 30),
s = c(0, .5)) %>%
mutate(x = t,
y = t^p) %>%
filter(t > s) ->
Z
library(ggplot2) # ggplot2_3.1.0
Z %>%
ggplot(aes(x,y)) +
facet_wrap(~s) +
geom_point()
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,第二个方面 (s=0.5) 仅具有 x > 0.5 的数据,其中(根据 tibble Z 的构造方式)来自 t > 0.5。
如果要为上述数据设置动画(t用作时间),我希望动画的前半部分的第二个方面为空,然后在后半部分显示与第一个方面相同的方面。然而:
library(gganimate) # gganimate_1.0.2
Z %>%
ggplot(aes(x, y, group = interaction(p,s))) +
facet_wrap(~s) +
geom_point() +
transition_time(t) + …Run Code Online (Sandbox Code Playgroud)