我有pandas dataframe一列文本字符串包含逗号分隔值.我想拆分每个CSV字段并为每个条目创建一个新行(假设CSV是干净的,只需要在','上拆分).例如,a应该成为b:
In [7]: a
Out[7]:
var1 var2
0 a,b,c 1
1 d,e,f 2
In [8]: b
Out[8]:
var1 var2
0 a 1
1 b 1
2 c 1
3 d 2
4 e 2
5 f 2
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经尝试了各种简单的函数,但是.apply当在轴上使用时,该方法似乎只接受一行作为返回值,而我无法.transform工作.我们欢迎所有的建议!
示例数据:
from pandas import DataFrame
import numpy as np
a = DataFrame([{'var1': 'a,b,c', 'var2': 1},
{'var1': 'd,e,f', 'var2': 2}])
b = DataFrame([{'var1': 'a', 'var2': 1},
{'var1': 'b', 'var2': 1},
{'var1': 'c', …Run Code Online (Sandbox Code Playgroud) 我有一个公式和一个数据框,我想提取model.matrix().但是,我需要生成的矩阵包含在原始数据集中找到的NA.如果我model.frame()这样做,我会简单地通过它na.action=NULL.但是,我需要的输出是model.matrix()格式.具体来说,我只需要右侧变量,我需要输出为矩阵(不是数据帧),我需要将因子转换为一系列虚拟变量.
我确信我可以使用循环或其他东西一起破解某些东西,但我想知道是否有人可以建议更清洁,更有效的解决方法.非常感谢你的时间!
这是一个例子:
dat <- data.frame(matrix(rnorm(20),5,4), gl(5,2))
dat[3,5] <- NA
names(dat) <- c(letters[1:4], 'fact')
ff <- a ~ b + fact
# This omits the row with a missing observation on the factor
model.matrix(ff, dat)
# This keeps the NA, but it gives me a data frame and does not dichotomize the factor
model.frame(ff, dat, na.action=NULL)
Run Code Online (Sandbox Code Playgroud)
这是我想要获得的:
(Intercept) b fact2 fact3 fact4 fact5
1 1 0.7266086 0 0 0 0
2 1 …Run Code Online (Sandbox Code Playgroud) 这是我第一次尝试Rcpp,这个非常简单的问题给了我麻烦.我想使用嵌套for循环来操作矩阵的各个值,一次一列.我瞄准的脚本看起来像这样:
src <- '
Rcpp::NumericMatrix Am(A);
int nrows = Am.nrow();
int ncolumns = Am.ncol();
for (int i = 0; i < ncolumns; i++){
for (int j = 1; j < nrows; j++){
Am[j,i] = Am[j,i] + Am[j-1,i];
}
}
return Am;
'
fun <- cxxfunction(signature(A = "numeric"), body = src, plugin="Rcpp")
fun(matrix(1,4,4))
Run Code Online (Sandbox Code Playgroud)
期望的输出是这样的:
[,1] [,2] [,3] [,4]
[1,] 1 1 1 1
[2,] 2 2 2 2
[3,] 3 3 3 3
[4,] 4 4 4 4
Run Code Online (Sandbox Code Playgroud)
问题显然在这一行,我不知道如何引用矩阵的各个元素.
Am[j,i] = …Run Code Online (Sandbox Code Playgroud) 我没有使用Fortran的经验,但是我试图通过使用.Fortran()函数从R调用它来运行该语言中的一个非常简单的循环.每当我运行下面粘贴的R代码的最后一行时,R gui崩溃,我得不到任何结果.我有兴趣将Fortran的实数x向量带回R进行进一步分析.g是0到1之间的数值,n是整数,它们都是由用户在R中提供的.
任何帮助将非常感激!最好,
文森特
保存在bar.f中的Fortran代码:
subroutine bar(n, g, x)
integer n
double precision g
double precision x(n)
integer i
x(1)=1
do 100 i = 2, n
x(i) = x(i-1) * g + 1
100 continue
end
Run Code Online (Sandbox Code Playgroud)
使用gfortran在Cygwin中编译DLL:
gfortran -shared -obar.dll bar.f
Run Code Online (Sandbox Code Playgroud)
R代码:
dyn.load("d:/bar.dll")
is.loaded("bar")
.Fortran("bar", n=as.integer(15), g=as.double(5), x=as.double(rnorm(5)))
Run Code Online (Sandbox Code Playgroud) 我编写了一个函数Rcpp并用它编译inline.现在,我想在不同的内核上并行运行它,但是我遇到了一个奇怪的错误.这里有一个小例子,其中功能funCPP1可以编译和运行本身很好,但不能被调用snow的clusterCall函数.该函数作为单个进程运行良好,但在并行运行时会出现以下错误:
Error in checkForRemoteErrors(lapply(cl, recvResult)) :
2 nodes produced errors; first error: NULL value passed as symbol address
Run Code Online (Sandbox Code Playgroud)
以下是一些代码:
## Load and compile
library(inline)
library(Rcpp)
library(snow)
src1 <- '
Rcpp::NumericMatrix xbem(xbe);
int nrows = xbem.nrow();
Rcpp::NumericVector gv(g);
for (int i = 1; i < nrows; i++) {
xbem(i,_) = xbem(i-1,_) * gv[0] + xbem(i,_);
}
return xbem;
'
funCPP1 <- cxxfunction(signature(xbe = "numeric", g="numeric"),body = src1, plugin="Rcpp")
## Single process …Run Code Online (Sandbox Code Playgroud) 如何在基本 R 图形中绘制点范围图和带状图?
以下是ggplot2我想在不依赖于基本 R 安装之外的情况下重现的两个图。我不需要复制任何主题元素或标签。
library(ggplot2)
library(marginaleffects)
# point range
mod <- lm(mpg ~ hp + factor(cyl), mtcars)
dat <- data.frame(names(coef(mod)), coef(mod), confint(mod)) |>
setNames(c("x", "y", "ymin", "ymax"))
ggplot(dat, aes(x = x, y = y, ymin = ymin, ymax = ymax)) +
geom_pointrange()
Run Code Online (Sandbox Code Playgroud)

# ribbon
mod <- lm(mpg ~ hp, mtcars)
pre <- predictions(mod)
ggplot(pre, aes(x = hp, y = estimate, ymin = conf.low, ymax = conf.high)) +
geom_ribbon(alpha = .3)
Run Code Online (Sandbox Code Playgroud)

我想从FRED系列创建一个数据集,我使用这样的quantmod包:
library(quantmod)
getSymbols(c('FEDFUNDS', 'GDPPOT', 'DGS10'), src='FRED')
dat <- buildData(FEDFUNDS ~ DGS10 + GDPPOT, na.rm=FALSE)
Run Code Online (Sandbox Code Playgroud)
我需要的是一个xts对象,其中包含对最长时间序列中所有日期的观察,以及缺少值以填充较短的时间序列.在上面的例子中,我得到:
> head(dat, 2)
FEDFUNDS DGS10 GDPPOT
1962-10-01 2.90 3.93 3141.6
1963-01-01 2.92 NA 3173.9
> head(FEDFUNDS, 2)
FEDFUNDS
1954-07-01 0.80
1954-08-01 1.22
> head(DGS10, 2)
DGS10
1962-01-02 4.06
1962-01-03 4.03
> head(GDPPOT, 2)
GDPPOT
1949-01-01 1864.8
1949-04-01 1885.2
Run Code Online (Sandbox Code Playgroud)
截断FEDFUNDS系列以匹配DGS10系列的最小日期值.我喜欢这个buildData()功能的便利,并且很乐意将它用于这个任务,但我想知道如何保持缺失的观察.
非常感谢你的时间!
编辑:我不想使用合并的原因是一些数据系列具有不同的周期性,并buildData()自动处理.
我正在比较两种替代策略,以使用data.tablefor 包来估计数据子集的线性回归模型R。这两种策略产生相同的系数,所以它们看起来是等价的。这种外表是骗人的。我的问题是:
为什么
lm模型中存储的数据不同?
library(data.table)
dat = data.table(mtcars)
# strategy 1
mod1 = dat[, .(models = .(lm(hp ~ mpg, data = .SD))), by = vs]
# strategy 2
mod2 = dat[, .(data = .(.SD)), by = vs][
, models := lapply(data, function(x) lm(hp ~ mpg, x))]
Run Code Online (Sandbox Code Playgroud)
乍一看,这两种方法似乎产生了相同的结果:
# strategy 1
coef(mod1$models[[1]])
#> (Intercept) mpg
#> 357.97866 -10.12576
# strategy 2
coef(mod2$models[[1]])
#> (Intercept) mpg
#> 357.97866 -10.12576
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试从(扩展的)model.frame 中提取数据,则会得到不同的结果:
# strategy 1
expanded_frame1 = expand.model.frame(mod1$models[[1]], …Run Code Online (Sandbox Code Playgroud) 我有一个公式,在左侧和右侧有任意数量的变量:
a + b * c ~ d + e
Run Code Online (Sandbox Code Playgroud)
此公式可以包含各种运算符,例如+或*。我想将公式的每个变量包装在一个转换中。例如,如果我的转换被称为Factor,那么上面的公式变为:
Factor(a) + Factor(b) * Factor(c) ~ Factor(d) + Factor(e)
Run Code Online (Sandbox Code Playgroud)
请注意,它保留了相同的符号。
对于这个简单的问题表示歉意。我不经常清理文本或使用正则表达式。
我有大量文本文件,我想删除其中的每一行,直到我的正则表达式找到匹配项。在我找到匹配项之前,通常会出现大约 15 行绒毛。我希望有一个如下所示的 Perl 单行代码:
perl -p -i -e "s/.*By.unanimous.vote//g" *.txt
Run Code Online (Sandbox Code Playgroud)
但这行不通。
谢谢