有问题.我需要将一个不规则的列表列表转换为宽格式的data.frame(即我需要相同数量的行),我只是无法弄清楚如何做到这一点.列表看起来像这样:
[[1]]
[1] 14
[[2]]
[1] 26
[[3]]
[1] 20 21 22 23
[[4]]
[1] 21 22
[[5]]
[1] 25
[[6]]
[1] 17 21 23
Run Code Online (Sandbox Code Playgroud)
我尝试过使用for循环和/或sapply的各种方法,但没有任何作用.不同长度的列表元素排除了我所做的任何尝试.在我看来,必须有一种相当直接的方法来做到这一点.一定不是吗?任何人都可以建议吗?
我正在做一些工作,我需要生成a)随机空间点b)非随机空间点,在多边形上,即b)点概率取决于例如东西渐变,或距某些点源的距离或者是其他东西
对于a)我可以使用包中的spsample()命令在多边形上生成随机点sp,如下所示:
# Load a spatial polygon from maptools package
library(maptools)
nc <- readShapePoly(system.file("shapes/sids.shp", package="maptools")[1], proj4string=CRS("+proj=longlat +datum=NAD27"))
plot(nc)
library(sp)
pts <- spsample(nc, 100, type="random")
plot(nc)
points(pts, pch=19, col="red")
Run Code Online (Sandbox Code Playgroud)
这给出了我想要的a).但是,这可以修改为b)所以东部比西部更有可能吗?(虽然仍然可以指定我想要100分?)
问题和解决方案改编的问题:使用ggplot2以粗体突出显示各个轴标签
我想根据满足标准选择性地证明水平轴标签的合理性.所以从上面的问题和答案中借鉴我已经建立了一个例子:
require(ggplot2)
require(dplyr)
set.seed(36)
xx<-data.frame(YEAR=rep(c("X", "Y"), each=20),
CLONE=rep(c("A", "B", "C", "D", "E"), each=4, 2),
TREAT=rep(c("T1", "T2", "T3", "C"), 10),
VALUE=sample(c(1:10), 40, replace=T))
# Simple plot with factors on y axis
ggplot(xx, aes(x = VALUE, y=CLONE, fill=YEAR)) +
geom_bar(stat="identity", position="dodge") +
facet_wrap(~TREAT)
Run Code Online (Sandbox Code Playgroud)
好的,所以我从上面的问题+答案中采用了函数来生成一个理由的向量:
# Modify to control justification
colorado2 <- function(src, boulder) {
if (!is.factor(src)) src <- factor(src)
src_levels <- levels(src)
brave <- boulder %in% src_levels
if (all(brave)) {
b_pos <- purrr::map_int(boulder, ~which(.==src_levels))
b_vec <- rep(0.2, length(src_levels))
b_vec[b_pos] <- …Run Code Online (Sandbox Code Playgroud) 我有一个函数,我应用于一个列,并将结果放在另一列,它有时给我integer(0)输出.所以我的输出列将是这样的:
45
64
integer(0)
78
Run Code Online (Sandbox Code Playgroud)
我如何检测这些integer(0)并替换它们NA?有类似的东西is.na()可以检测到它们吗?
编辑:好的我想我有一个可重复的例子:
df1 <-data.frame(c("267119002","257051033",NA,"267098003","267099020","267047006"))
names(df1)[1]<-"ID"
df2 <-data.frame(c("257051033","267098003","267119002","267047006","267099020"))
names(df2)[1]<-"ID"
df2$vals <-c(11,22,33,44,55)
fetcher <-function(x){
y <- df2$vals[which(match(df2$ID,x)==TRUE)]
return(y)
}
sapply(df1$ID,function(x) fetcher(x))
Run Code Online (Sandbox Code Playgroud)
此输出sapply是问题的根源.
> str(sapply(df1$ID,function(x) fetcher(x)))
List of 6
$ : num 33
$ : num 11
$ : num(0)
$ : num 22
$ : num 55
$ : num 44
Run Code Online (Sandbox Code Playgroud)
我不希望这是一个列表 - 我想要一个矢量,而不是num(0)我想要的NA(注意它给出的玩具数据num(0)- 在我给出的真实数据中(integer(0)).
好的我是(非常)新手Python用户,但我试图将一段Python代码翻译成R,我遇到了一个令人困惑的问题,即数组重塑.
让我们做一些示例数据:
X1 = np.array([[-0.047, -0.113, 0.155, 0.001],
[0.039, 0.254, 0.054, 0.201]], dtype=float)
In:X1
Out:
array([[-0.047, -0.113, 0.155, 0.001],
[0.039, 0.254, 0.054, 0.201]])
In:X1.shape
Out: (2,4)
Run Code Online (Sandbox Code Playgroud)
好的,我已经制作了一个包含2行和4列的2D数组.我很高兴.这行代码产生了混乱:
X2 = X1.reshape((2, -1, 1))
In: X2
Out:
array([[[-0.047],
[-0.113],
[0.155],
[0.001]],
[0.039],
[0.254],
[0.054],
[0.201]]])
In: X2.shape
Out: (2, 4, 1)
Run Code Online (Sandbox Code Playgroud)
所以我知道我添加了一个额外的维度(我认为是1reshape命令中的第三个数字),但我不明白这是做了什么的.形状意味着它仍然有2行4列,但显然还有其他东西被改变了.我的动机再一次是在R中做同样的操作,但直到我知道我明白我在这里转变了什么我才被困住了.(请原谅我,如果这是一个非常糟糕的问题我昨天才开始使用Python!)
我有一些带有 4 维数组的代码,我需要在多个维度上应用 which.max。它很慢,我想找到加快速度的方法。
例子:
library(microbenchmark)
array4d <- array( runif(5*500*50*5 ,-1,0),
dim = c(5, 500, 50, 5) )
microbenchmark(
max_idx <- apply(array4d, c(1,2,3), which.max )
)
Run Code Online (Sandbox Code Playgroud)
任何提示表示赞赏,谢谢!
编辑:通过直接在 for 循环中对其进行编码,我设法使其稍微快了一点(虽然丑陋) - 但我希望那里有人有更好的想法!
method1 <- function(z) {
apply(z, c(1,2,3), which.max)
}
method2 <- function(z){
result <- array( , dim = dim(z)[1:3] )
for(i in 1:dim(z)[1]){
for(j in 1:dim(z)[2]){
for(k in 1:dim(z)[3]){
result[i, j, k] <- which.max(z[i,j,k,])
}
}
}
return(result)
}
microbenchmark(
result1 <- method1(array4d),
result2 <- method2(array4d))
> microbenchmark(
+ …Run Code Online (Sandbox Code Playgroud) 我希望根据多个列上的条件匹配两个数据帧,但无法弄清楚如何.所以,如果有我的数据集:
df1 <- data.frame(lower=c(0,5,10,15,20), upper=c(4,9,14,19,24), x=c(12,45,67,89,10))
df2 <- data.frame(age=c(12, 14, 5, 2, 9, 19, 22, 18, 23))
Run Code Online (Sandbox Code Playgroud)
我希望将df2中的年龄与df1中的下限和上限之间的范围相匹配,目的是在df1中添加一个额外的列,其中包含df1中x的值,其中age位于上下之间.即我希望df2看起来像
age x
12 67
14 67
5 45
....etc.
Run Code Online (Sandbox Code Playgroud)
我怎样才能实现这样的匹配?
因此,我正在使用该mice软件包估算缺少的数据。我是归因于算术的新手,所以我已经讲了一点,但是却遇到了陡峭的学习曲线。举一个玩具的例子:
library(mice)
# Using nhanes dataset as example
df1 <- mice(nhanes, m=10)
Run Code Online (Sandbox Code Playgroud)
因此,如您所见,我使用默认设置大多数情况下估算了df1 10次-我很乐意将此结果用于回归模型,合并结果等。但是在我的实际数据中,我有来自不同国家/地区的调查数据。因此,失踪的程度因国家/地区而异,具体变量的值(即年龄,受教育程度等)的值也不同。因此,我想归纳失踪者,以便按国家进行聚类。因此,我将创建一个没有缺失的分组变量(当然,在此玩具示例中,与其他变量的相关性缺失,但是在我的真实数据中它们存在)
# Create a grouping variable
nhanes$country <- sample(c("A", "B"), size=nrow(nhanes), replace=TRUE)
Run Code Online (Sandbox Code Playgroud)
因此,如何分辨mice()此变量与其他变量不同-即它是多级数据集中的一个级?
这是这个问题的后续问题:在Rcpp和R中生成相同的随机变量
我正在尝试加速对这种形式的rbinom的向量化调用:
x <- c(0.1,0.4,0.6,0.7,0.8)
rbinom(length(x),1 ,x)
Run Code Online (Sandbox Code Playgroud)
在x的实时代码中是一个可变长度的向量(但通常以百万为单位编号).我没有Rcpp的经验,但我想知道我可以使用Rcpp来加快速度.从链接的问题来看,这个Rcpp代码被建议用于@Dirk Eddelbuettel的非矢量化rbinom调用:
cppFunction("NumericVector cpprbinom(int n, double size, double prob) { \
return(rbinom(n, size, prob)); }")
set.seed(42); cpprbinom(10, 1, 0.5)
Run Code Online (Sandbox Code Playgroud)
....并且大约是非Rcpp选项的两倍,但无法处理我的矢量化版本
cpprbinom(length(x), 1, x)
Run Code Online (Sandbox Code Playgroud)
如何修改Rcpp代码来实现这一点?
谢谢
以下面的例子为例:
library(ggplot2)
dsamp <- diamonds[sample(nrow(diamonds), 1000), ]
ggplot(dsamp, aes(x = x)) +
geom_line(aes(y = y, linetype = "Simple Model")) +
geom_line(aes(y = z, linetype = "Complex Model"))
Run Code Online (Sandbox Code Playgroud)
好的。我的问题是我想要反转线型。我希望简单模型有实线,复杂模型有虚线。默认情况下,字母顺序似乎决定了这里的线型。我已经使用 scale_linetype_manual 等尝试了不同的变体,但尽我所能,我无法将简单的线条设为实线,将复杂的线条设为虚线,同时在图例中保留“简单”和“复杂”标题。在有人提出建议之前,我试图避免融化/重塑这些数据,使两个 y 变量都在 1 列中,因为实际数据在绘图等中具有更多内容,并且会非常复杂。
编辑:好的,感谢 Haboryme 的回复。我找到了我困惑的根源。
采取以下情节:
ggplot(dsamp, aes(x = x)) +
geom_line(aes(y = y, linetype = "Simple Model"), size = 1.5) +
geom_line(aes(y = z, linetype = "Complex Model"), size = 1.5) +
scale_linetype_manual(values=c( 5, 1))
Run Code Online (Sandbox Code Playgroud)
但是,如果我将其更改为线型 3:
ggplot(dsamp, aes(x = x)) +
geom_line(aes(y = y, …Run Code Online (Sandbox Code Playgroud) 我正在将一些涉及 3D 矩阵的代码从 Python 翻译成 R。这很棘手,因为我对 Python 或矩阵代数知之甚少。总之在Python代码中,我有一个矩阵dot.product如下:np.dot(A, B)。矩阵 A 的维数为 (10, 4),矩阵 B 的维数为 (2, 4, 2)。(这些维度可能会有所不同,但始终会在第二个维度上匹配)。所以 np.dot 从文档中看没有问题:
“对于二维数组,它相当于矩阵乘法,对于一维数组,相当于向量的内积(没有复共轭)。对于 N 维,它是 a 的最后一个轴和第二个到- b的最后一个:”
因此它沿 A=4 的第二个轴和 B=4 的中轴相乘,并输出一个 (10,2,2) 矩阵。=> 没问题。但是在 R 中,%*%没有这种行为并抛出“不符合数组”的错误。
r 中的玩具示例:
A <- matrix( rnorm(10*4), nrow=10, ncol=4)
B <- array( rnorm(2*4*2), c(2,4,2))
A %*% B
Error in A %*% B : non-conformable arrays
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题以实现与 相同的计算np.dot?
主要编辑:由于我的原著放置不当,我决定重写这个问题。我将在下面保留原始问题,以保持记录。基本上,我需要在4 x 5的大表上进行费舍尔测试,并进行200个观察。事实证明,这往往是作为解释的一大挑战计算这里(我想,我不能按照它完全)。当我同时使用R和Stata时,我将用一些虚构数据对问题进行框架化。
Stata:
tabi 1 13 3 27 46 \ 25 0 2 5 3 \ 22 2 0 3 0 \ 19 34 3 8 1 , exact(10)
Run Code Online (Sandbox Code Playgroud)
您可以增加到exact()1000个最大值(但可能需要一天的时间才能返回错误)。
R:
Job <- matrix(c(1,13,3,27,46, 25,0,2,5,3, 22,2,0,3,0, 19,34,3,8,1), 4, 5,
dimnames = list(income = c("< 15k", "15-25k", "25-40k", ">40k"),
satisfaction = c("VeryD", "LittleD", "ModerateS", "VeryS", "exstatic")))
fisher.test(Job)
Run Code Online (Sandbox Code Playgroud)
至少对我来说,这两个程序都出错。那么问题是如何在Stata或R上进行此计算?
原始问题:我有Stata和R一起玩。我有一个包含各种分类变量的数据集,其中一些具有多个类别。因此,我想用超过2 x 2的类别进行Fisher的精确测试,即将Fisher应用于2 x 6的表或4 x 4的表。
可以使用R或Stata完成此操作吗?
编辑:虽然这可以在Stata中完成-但由于我的类别过多,因此不适用于我的数据集。Stata经过无休止的迭代,甚至搁置一天或更长时间也无法解决。
我的问题确实是-R可以做到吗,并且它可以很快做到吗?