小编Hen*_*nry的帖子

来自R数据帧子集的行的随机样本

有没有一种从数据帧的一部分获取行样本的好方法?

如果我只是有数据,如

gender <- c("F", "M", "M", "F", "F", "M", "F", "F")
age    <- c(23, 25, 27, 29, 31, 33, 35, 37)
Run Code Online (Sandbox Code Playgroud)

然后我可以轻松地抽取三个Fs的年龄

sample(age[gender == "F"], 3)
Run Code Online (Sandbox Code Playgroud)

得到类似的东西

[1] 31 35 29
Run Code Online (Sandbox Code Playgroud)

但是如果我将这些数据转换为数据帧

mydf <- data.frame(gender, age) 
Run Code Online (Sandbox Code Playgroud)

我不能用明显的

sample(mydf[mydf$gender == "F", ], 3)
Run Code Online (Sandbox Code Playgroud)

虽然我可以用一些荒谬的括号来编造一些令人费解的东西

mydf[sample((1:nrow(mydf))[mydf$gender == "F"], 3), ]
Run Code Online (Sandbox Code Playgroud)

得到我想要的东西

  gender age
7      F  35
4      F  29
1      F  23
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法让我花更少的时间来研究如何写?

r sample dataframe

12
推荐指数
2
解决办法
3万
查看次数

基于匹配每个数据帧中的两个可交换列来合并两个数据帧

我在R中有两个数据帧.

数据帧1

A B C D E F G
1 2 a a a a a
2 3 b b b c c
4 1 e e f f e
Run Code Online (Sandbox Code Playgroud)

数据帧2

X Y Z
1 2 g
2 1 h
3 4 i
1 4 j
Run Code Online (Sandbox Code Playgroud)

我想将dataframe1的A列和B列与dataframe2的X和Y列匹配.它不是成对比较,即第1行(A = 1 B = 2)被认为与第1行相同(X = 1,Y = 2) )和数据帧2的第2行(X = 2,Y = 1).

当找到匹配时,我想将dataframe1的C,D,E,F列添加回dataframe2的匹配行,如下所示:没有匹配为na.

最终的数据框架

X Y Z C  D  E  F  G
1 2 g a  a  a  a  a 
2 …
Run Code Online (Sandbox Code Playgroud)

merge r match dataframe

6
推荐指数
1
解决办法
3558
查看次数

从多个数据框中提取具有相同名称的列 [R]

我正在处理大约 10 个具有相同列名但行数不同的数据框。我想创建一个包含所有同名列的列表。

所以,假设我有 2 个同名的数据框。

a<-seq(0,20,1)
b<-seq(20,40,1)
c<-seq(10,30,1)

df.abc.1<-data.frame(a,b,c)

a<-seq(20,50,1)
b<-seq(10,40,1)
c<-seq(30,60,1)

df.abc.2<-data.frame(a,b,c)
Run Code Online (Sandbox Code Playgroud)

我知道我可以根据这些数据创建一个列表,例如,

list(df.abc.1$a, df.abc.2$a)
Run Code Online (Sandbox Code Playgroud)

但我不想输入长数据框名称和列名称。

我本来希望做这样的事情

list(c(df.abc.1, df.abc.2)$a)
Run Code Online (Sandbox Code Playgroud)

但是,它返回 df.abc.1$a 的列表

也许有一种方法可以跨多个 data.frames 使用 grep 函数?也许循环可以完成这个任务?

r

4
推荐指数
1
解决办法
4882
查看次数

R中的加权逻辑回归

给出成功比例加上样本大小和自变量的样本数据,我在R中尝试逻辑回归.

下面的代码做了我想要的,似乎给出了明智的结果,但看起来不是一个明智的方法; 实际上,它会使数据集的大小翻倍

datf <- data.frame(prop  = c(0.125, 0,  0.667, 1,  0.9),
                   cases = c(8,     1,  3,     3,  10),
                   x     = c(11,    12, 15,    16, 18))

datf2         <- rbind(datf,datf)
datf2$success <- rep(c(1, 0), each=nrow(datf))
datf2$cases   <- round(datf2$cases*ifelse(datf2$success,datf2$prop,1-datf2$prop))
fit2          <- glm(success ~ x, weight=cases, data=datf2, family="binomial")

datf$proppredicted    <- 1 / (1 + exp(-predict(fit2, datf)))
plot(datf$x, datf$proppredicted, type="l", col="red", ylim=c(0,1))
points(datf$x, datf$prop, cex=sqrt(datf$cases))
Run Code Online (Sandbox Code Playgroud)

制作一个类似的图表 后勤预测

这看起来相当合理.

但我不喜欢使用datf2复制数据来分离成功和失败的方法.这样的事情有必要吗?

作为一个较小的问题,是否有更简洁的方法来计算预测的比例?

r logistic-regression

3
推荐指数
1
解决办法
3925
查看次数

使用R查找所有小于给定数字的3个数字组合

我有以下一组数字10、17、5、7、15。从这些数字中,我需要找到总和小于或等于35的所有3个数字组合。在一个这样的组合中,特定数字不应包含一次以上。例如:10,10,5是不正确的组合,因为10重复了两次。

我尝试了这段代码,但没有给出我所需要的。

library(data.table)
df=expand.grid(x1=c(10,17,5,7,15),
               x2=c(10,17,5,7,15),
               x3=c(10,17,5,7,15)
               )
setDT(df)
df[(x1+x2+x3) <= 35]
Run Code Online (Sandbox Code Playgroud)

上面代码输出的一部分如下,

  x1 x2 x3
 1: 10 10 10
 2:  5 10 10
 3:  7 10 10
 4: 15 10 10
 5:  5 17 10
 6:  7 17 10
 7: 10  5 10
Run Code Online (Sandbox Code Playgroud)

根据上述输出,可以看到一个数字出现了多次。任何人都可以建议获得预期结果的提示吗?

谢谢

combinations r dynamic

3
推荐指数
2
解决办法
133
查看次数

从 R 中的分布随机抽样的速度

我试图研究一个概率分布,它的矩是加泰罗尼亚数,并想出了

qcatmo <- function(p, k=4){ (qbeta(p/2+1/2, 3/2, 3/2)*2 - 1)^2 * k } 
colMeans(outer(qcatmo(ppoints(10^6)), 0:10, "^"))
#      1     1     2     5    14    42   132   429  1430  4862 16796
Run Code Online (Sandbox Code Playgroud)

效果很好。但是后来我尝试从这个分布中生成随机值,并找到了三种可能的方法(A 使用我已经知道的分位数函数应用于runif,B 使用内置rbeta函数稍微更直接,C 使用一种拒绝采样的形式runif) 在大样本上使用时具有明显不同的速度:

rcatmoA <- function(n, k=4){ qcatmo(runif(n), k) }
rcatmoB <- function(n, k=4){ (rbeta(n, 3/2, 3/2)*2 - 1)^2 * k }
rcatmoC <- function(n, k=4){
             n0 <- ceiling(n*4/pi + 7*sqrt(n) + 35)
             x0 <- runif(n0)^2 
             y0 <- runif(n0)^2 
             x0[x0 + y0 …
Run Code Online (Sandbox Code Playgroud)

random performance r distribution

0
推荐指数
1
解决办法
90
查看次数