我知道切片列表不会生成列表中对象的副本;它只是复制对它们的引用。
但如果是这样的话,那为什么这行不通呢?
l = [1, 2, 3]
# Attempting to modify the element at index 1
l[0:2][-1] = 10
# but the attempt fails. The original list is unchanged
l
> [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
不应该l[0:2][-1]指向原始列表索引 1 处的元素吗?
我试图在R中计算这个后验分布.问题是分子是一堆dbern(p_i,y_i)<1的乘积,它太小了.(我的约是1500).因此,R吐出0,所有\ theta的后验值也为0.
为了澄清,每个y_i都有自己的p_i,这些p_i一起构成n个元素的n个元素的向量.每个theta都有自己的n元素向量p_i.

一个可重复的例子(分子)
p <- sample(seq(0.001,0.999,by=0.01), 1500, replace=T)
y <- sample(c(0,1), 1500, replace=T)
dbern(y, p) # 1500-element vector, each element < 1
prod(dbern(y, p)) # produces 0
exp(sum(log(dbern(y, p)))) # produces 0
Run Code Online (Sandbox Code Playgroud)
编辑(上下文):我正在进行贝叶斯变换点分析(jstor.org/stable/25791783 - Western和Kleykamp 2004).与论文中的连续y不同,我的y是二元的,所以我在Albert和Chib(1993)中使用数据增强方法.使用该方法,y的可能性是伯努利,p = cdf-normal(x'B).
那么p如何依赖于theta?这是因为θ是变化点.其中一个x是时间虚拟 - 例如,如果θ= 10,那么对于第10天之后的所有观察,时间dummy = 1,并且对于第10天之前的所有观察,= 0.
因此,p取决于x,x取决于θ - 因此,p取决于θ.
我需要上面的数量,因为这是吉布斯采样中theta的完全条件.
我有一个查询,其中where条件如下:
WHERE A.event_date BETWEEN B.start_date AND B.end_date
Run Code Online (Sandbox Code Playgroud)
复杂性是,如果B.start_date是NULL,则意味着从远古时代开始,同样B.end_date是NULL,它意味着现在.所以,我还是要选择一排,其中A.event_date > B.start_date和B.end_date是NULL,例如.
这种冗长的方式是
WHERE A.event_date BETWEEN B.start_date AND B.end_date
OR (A.event_date > B.start_date AND B.end_date IS NULL)
OR (B.start_date IS NULL AND A.event_date < B.end_date)
Run Code Online (Sandbox Code Playgroud)
有没有更优雅的解决方案(特别是因为在一个查询中我有多个这样的条件)
haven::read_dta支持使用label属性将变量标签从 Stata 导入 R。Rstudio 还支持在视图窗格中显示这些标签。
但是,当使用dplyr::bind_rows(或rbind_all)绑定两个数据框时,不会保留标签。这是一个错误吗?
library(dplyr)
id <- 1:5
attr(id, "label") <- "unit id"
df1 <- tbl_df(data.frame(id)) # label is fine
df1$id
# [1] 1 2 3 4 5
# attr(,"label")
# [1] "unit id"
df2 <- tbl_df(data.frame(id)) # label is fine
df2$id
# [1] 1 2 3 4 5
# attr(,"label")
# [1] "unit id"
df_bound <- bind_rows(df1, df2) # label is gone
df_bound$id
# [1] 1 2 3 4 5 …Run Code Online (Sandbox Code Playgroud) 鉴于此数据框:
In [40]: df = pd.DataFrame({'A': [1, 1], 'B': [2, 2], 'C': [3, 3]})
In [41]: df
Out[41]:
A B C
0 1 2 3
1 1 2 3
Run Code Online (Sandbox Code Playgroud)
如果我将字符串列表传递给[],它将过滤列:
In [42]: df[['A', 'C']]
Out[42]:
A C
0 1 3
1 1 3
Run Code Online (Sandbox Code Playgroud)
但是,如果我将布尔值列表传递给[],它将过滤行:
In [45]: df[[True, False]]
Out[45]:
A B C
0 1 2 3
Run Code Online (Sandbox Code Playgroud)
有没有办法考虑这种差异,而不是“它就是这样”?
我想对一堆变量应用t检验.下面是一些模拟数据
d <- data.frame(var1=rnorm(10),
var2=rnorm(10),
group=sample(c(0,1), 10, replace=TRUE))
# Is there a way to do this in some sort of loop?
with(d, t.test(var1~group))
with(d, t.test(var2~group))
# I tried this but the loop did not give a result!?
varnames <- c('var1', 'var2')
for (i in 1:2) {
eval(substitute(with(d, t.test(variable~group)),
list(variable=as.name(varnames[i]))))
}
Run Code Online (Sandbox Code Playgroud)
此外,是否可以从t检验的结果中提取值(例如,两个组均值,p值),以便循环将在变量之间产生一个整齐的平衡表?换句话说,我想要的最终结果不是一堆t测试,而是一个像这样的表:
Varname mean1 mean2 p-value
Var1 1.1 1.2 0.989
Var2 1.2 1.3 0.912
Run Code Online (Sandbox Code Playgroud) 我收到以下错误:
dcast(rep.data, country ~ variable, mean, fill=NA)
Error in vapply(indices, fun, .default) : values must be type 'logical',
but FUN(X[[4]]) result is type 'double'
Run Code Online (Sandbox Code Playgroud)
以下是rep.data上面的数据框:
structure(list(id = c("MRT1996", "BFA1982", "LBR1990", "UKR2000",
"MNG1993", "VEN1992", "OMN1987", "LAO1996", "OMN1982", "SYR1993"
), wbcode = c("MRT", "BFA", "LBR", "UKR", "MNG", "VEN", "OMN",
"LAO", "OMN", "SYR"), polcode = c("MAA", "BFO", "LBR", "UKR",
"MON", "VEN", "OMA", "LAO", "OMA", "SYR"), country = c("Mauritania",
"Burkina Faso", "Liberia", "Ukraine", "Mongolia", "Venezuela, RB",
"Oman", "Lao PDR", "Oman", "Syrian Arab …Run Code Online (Sandbox Code Playgroud) 我遇到了这个问题中讨论的相同错误消息,归结为:
Error : .onLoad failed in loadNamespace() for 'rJava', details:
call: dyn.load(file, DLLpath = DLLpath, ...)
error: unable to load shared object '/home/anh/Rlibs/rJava/libs/rJava.so':
libjvm.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
问题是,在答案之后(即设置LD_LIBRARY_PATH指向libjvm.so)在命令行中解决了我的问题R,但Rstudio libjvm.so仍然无法找到.
系统规格:Ubuntu 14.04,R 3.1.1,Rstudio Desktop 0.98,apt-get install r-cran-rjava完成
这是直接来自教程,即使在阅读文档之后我也无法理解.
In [14]: df = DataFrame({'one' : Series(randn(3), index=['a', 'b', 'c']),
....: 'two' : Series(randn(4), index=['a', 'b', 'c', 'd']),
....: 'three' : Series(randn(3), index=['b', 'c', 'd'])})
....:
In [15]: df
Out[15]:
one three two
a -0.626544 NaN -0.351587
b -0.138894 -0.177289 1.136249
c 0.011617 0.462215 -0.448789
d NaN 1.124472 -1.101558
In [16]: row = df.ix[1]
In [17]: column = df['two']
In [18]: df.sub(row, axis='columns')
Out[18]:
one three two
a -0.487650 NaN -1.487837
b 0.000000 0.000000 0.000000
c 0.150512 0.639504 -1.585038 …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 下载以下数据集download.file,该数据集仅在method = "wget")时有效
# Doesn't work
download.file('http://uofi.box.com/shared/static/bba3968d7c3397c024ec.dta', tempfile(), method = "auto")
download.file('http://uofi.box.com/shared/static/bba3968d7c3397c024ec.dta', tempfile(), method = "curl")
# Works
download.file('http://uofi.box.com/shared/static/bba3968d7c3397c024ec.dta', tempfile(), method = "wget")
Run Code Online (Sandbox Code Playgroud)
根据help(download.file),
如果选择 method = "auto"(默认),则为 file:// URL 选择内部方法,而对于其他提供的功能(“http/ftp”)为 true(几乎总是如此)。
看源码,“内部方法”指的是:
if (method == "internal") {
status <- .External(C_download, url, destfile, quiet,
mode, cacheOK)
if (!quiet)
flush.console()
}
Run Code Online (Sandbox Code Playgroud)
但我仍然不知道.External(C_download)会发生什么,尤其是跨平台。对我来说,了解这一点而不是依赖它很重要,wget因为我正在编写一个应该跨平台工作的包。