我想删除NA
数据框中超过50%s的所有列或行.
这是我的解决方案:
# delete columns with more than 50% missings
miss <- c()
for(i in 1:ncol(data)) {
if(length(which(is.na(data[,i]))) > 0.5*nrow(data)) miss <- append(miss,i)
}
data2 <- data[,-miss]
# delete rows with more than 50% percent missing
miss2 <- c()
for(i in 1:nrow(data)) {
if(length(which(is.na(data[i,]))) > 0.5*ncol(data)) miss2 <- append(miss2,i)
}
data <- data[-miss,]
Run Code Online (Sandbox Code Playgroud)
但我正在寻找一个更好/更快的解决方案.
我也很感激dplyr
解决方案
考虑这个例子:
data(tips, package = "reshape")
library(GGally)
pm <- ggpairs(tips, mapping = aes(color = sex), columns = c("total_bill", "time", "tip"))
pm
Run Code Online (Sandbox Code Playgroud)
如何使密度图更透明并去除黑线?
这些GGally
软件包最近似乎发生了很大的变化,我找不到一个有效的解决方案
更新
我找到了如何使用自定义函数更改alpha:
my_dens <- function(data, mapping, ..., low = "#132B43", high = "#56B1F7") {
ggplot(data = data, mapping=mapping) +
geom_density(..., alpha=0.7)
}
pm <- ggpairs(tips, mapping = aes(color = sex), columns = c("total_bill", "time", "tip"),
diag=list(continuous=my_dens))
pm
Run Code Online (Sandbox Code Playgroud)
但黑线仍然存在.
有没有办法caret
用于生存分析.我真的很喜欢它的易用性.我尝试使用party
包在插入符号列表中的随机生存林.
这有效:
library(survival)
library(caret)
library(party)
fitcforest <- cforest(Surv(futime, death) ~ sex+age, data=flchain,
controls = cforest_classical(ntree = 1000))
Run Code Online (Sandbox Code Playgroud)
但是使用caret
我得到一个错误:
fitControl <- trainControl(## 10-fold CV
method = "repeatedcv",
number = 10,
repeats = 2,
)
cforestfit <- train(Surv(futime, death) ~ sex+age,data=flchain, method="cforest",trControl = fitControl)
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
Error: nrow(x) == length(y) is not TRUE
Run Code Online (Sandbox Code Playgroud)
有没有办法让这些Surv
对象与插入符号一起工作?我可以使用其他以生存分析为导向的包装吗?
谢谢
我有一个这样的数据框,每个都有不同的观察结果id
:
library(dplyr)
df <- data.frame(id=c(1,1,1,1,1,2,2,3), v1= rnorm(8), v2=rnorm(8))
Run Code Online (Sandbox Code Playgroud)
然后我分组id
:
by_id <- group_by(df, id)
Run Code Online (Sandbox Code Playgroud)
现在我想计算v1
每个观测值的平均值和sd id
.这很简单summarise
:
df2 <- summarise(by_id,
v1.mean=mean(v1),
v1.sd=sd(v1))
Run Code Online (Sandbox Code Playgroud)
现在,我想补充的线性回归的斜率v1
和v2
df2 <- summarise(by_id,
v1.mean=mean(v1),
v1.sd=sd(v1),
slope=as.vector(coef(lm(v1~v2,na.action="na.omit")[2])))
Run Code Online (Sandbox Code Playgroud)
然而,这失败了,我认为因为一个人(id = 3)只有一个观察,因此不能建立一个线性模型.
我也试过了
slope=ifelse(n()==1,0,as.vector(coef(lm(v1~v2,na.action="na.omit")[2]))))
Run Code Online (Sandbox Code Playgroud)
但它也不起作用.有一个简单的解决方案吗?
并不是说如果我有多个观察但是例如v2
缺少值,那么lm
也可能是失败的情况.
我使用sas7bdat
包加载了一个sas7bdat文件,但日期转换为这样的数字:
sas <- c(16922, 17045, 17014, 16983)
Run Code Online (Sandbox Code Playgroud)
我试过了
rPOSIX <- as.POSIXct(sas,origin='1960-01-01')
Run Code Online (Sandbox Code Playgroud)
如上所述,但这是错的.我无法访问SAS,但日期应该是2006年左右.
我有一个分组的熊猫箱图,安排在(2,2)网格中:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.rand(140, 4), columns=['A', 'B', 'C', 'D'])
df['models'] = pd.Series(np.repeat(['model1','model2', 'model3', 'model4', 'model5', 'model6', 'model7'], 20))
bp = df.boxplot(by="models",layout=(2,2),figsize=(6,8))
plt.show()
Run Code Online (Sandbox Code Playgroud)
我现在只想更改ylim
第二行.
我的想法是添加:
[ax_tmp.set_ylim(-10,10) for ax_tmp in np.asarray(bp).reshape(-1)[2:4]]
Run Code Online (Sandbox Code Playgroud)
要么
[ax_tmp.set_ylim(-10,10) for ax_tmp in np.asarray(bp)[1,:]]
Run Code Online (Sandbox Code Playgroud)
但他们都改变了所有子图的ylim.这可能是因为共享.但我不知道要摆脱它.
我的问题与这个问题有些相关:pandas boxplot,groupby在每个子图中不同的ylim,但在我看来并不重复.此解决方案也不容易适用.
更新:理想情况下,行应共享一个共同的y,而不是每个绘图都有自己的
我有这样的数据框
df <- data.frame(v1 = 10:14, v2 = c(NA, 1, NA, 3, 6), v3 = c(1, NA, NA, 9, 4))
v1 v2 v3
1 10 NA 1
2 11 1 NA
3 12 NA NA
4 13 3 9
5 14 6 4
Run Code Online (Sandbox Code Playgroud)
我现在想用前一列的值填充NAs,所以它看起来像这样:
v1 v2 v3
1 10 10 1
2 11 1 1
3 12 12 12
4 13 3 9
5 14 6 4
Run Code Online (Sandbox Code Playgroud)
我知道如何手动执行此操作,如下所示:
df$v2 <- ifelse(is.na(df$v2), df$v1, df$v2)
Run Code Online (Sandbox Code Playgroud)
如何在包含多列的完整数据框架中自动执行此操作?
我rfsrc
用来模拟生存问题,像这样:
library(OIsurv)
library(survival)
library(randomForestSRC)
data(burn)
attach(burn)
library(randomForestSRC)
fit <- rfsrc(Surv(T1, D1) ~ ., data=burn)
# predict on the train set
pred <- predict(fit, burn, OOB=TRUE, type=response)
pred$predicted
Run Code Online (Sandbox Code Playgroud)
这给了我所有患者的总生存概率.
如何获得不同时间点(例如0-5个月或0-10个月)的每个人的生存概率?
我尝试在haskell中解决以下问题:
使用gcd(a,100)= 1找到每个a的最小数字b(a ^ b mod 100)= 1
我试过这个:
head[ b | a <- [1..], b <- [1..], (a^b `mod` 100) == 1, gcd a 100 == 1]
Run Code Online (Sandbox Code Playgroud)
但这会产生1 ^ 1作为第一个解决方案,这是不正确的,它应该适用于每一个 ; 例如,3 ^ 1不是解决方案.我认为正确的解决方案是b = 20但我想在haskell中使用它.
H,我有一个像这样的数据框:
d <- data.frame(v1=seq(0,9.9,0.1),
v2=rnorm(100),
v3=rnorm(100))
> head(d)
v1 v2 v3
1 0.0 -0.01431916 -0.5005415
2 0.1 -1.01575590 1.5307473
3 0.2 1.00081065 -0.1730830
4 0.3 -1.20697918 0.5105118
5 0.4 -2.16698578 -1.0120544
6 0.5 0.33886508 0.4797016
Run Code Online (Sandbox Code Playgroud)
我现在想要一个新的数据框,该数据框汇总所有区间0-0.99、1-1.99、2-2.99、3-3.99 ...中的值。
像这样
start end mean.v2 mean.v3
0 1 0.2 0.1
1 2 0.5 0.4
Run Code Online (Sandbox Code Playgroud)
等等
谢谢
更新,我应该补充一点,在我的真实数据集中,每个时间间隔的观察值具有不同的长度,并且它们并不总是从零开始或以10结束