有没有一种从数据帧的一部分获取行样本的好方法?
如果我只是有数据,如
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中有两个数据帧.
数据帧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) 我正在处理大约 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中尝试逻辑回归.
下面的代码做了我想要的,似乎给出了明智的结果,但看起来不是一个明智的方法; 实际上,它会使数据集的大小翻倍
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复制数据来分离成功和失败的方法.这样的事情有必要吗?
作为一个较小的问题,是否有更简洁的方法来计算预测的比例?
我有以下一组数字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)
根据上述输出,可以看到一个数字出现了多次。任何人都可以建议获得预期结果的提示吗?
谢谢
我试图研究一个概率分布,它的矩是加泰罗尼亚数,并想出了
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) r ×6
dataframe ×2
combinations ×1
distribution ×1
dynamic ×1
match ×1
merge ×1
performance ×1
random ×1
sample ×1