假设有两列,一列表示 p 值,另一列表示斜率。我想找到一种方法来仅绘制具有显著 p 值的斜率数据点。这是我的代码:
print("State the file name (include .csv)")
filename <- readline()
file <- read.csv(filename)
print ("Only include trials with p-value < .05? (enter yes or no)")
pval_filter <- readline()
if (pval_filter == "yes"){
i <- 0
count <- 0
filtered <- NULL
while (i > length(file$pval)){
if (file$pval[i] < .05){
filtered[count] <- i
count <- count + 1
}
i <- i + 1
}
x <- 0
while (x != -1){
print("State the variable to be plotted")
temp_var <- readline()
counter <- 0
var <- NULL
while (counter > length(filtered)){
var[counter] = file [, temp_var][filtered[counter]]
counter <- counter + 1
}
print ("State the title of the histogram")
title <- readline()
hist(var, main = title, xlab = var)
print("Enter -1 to exit or any other number to plot another variable")
x <- readline()
}
}
这不是短得多,并且产生大致相同的结果:
df = read.csv('file.csv')
df = df[df$pval < 0.05,]
hist(df$value)
这至少应该让你开始。
关于代码的一些评论:
- 您使用大量保留名称(var,文件)作为对象名称,这是一个坏主意。
- 如果您希望程序使用用户输入,则需要在对其进行任何操作之前对其进行检查。
- 没有必要显式循环 data.frame 中的行,R 是矢量化的(例如,请参阅上面的我如何子集化
df
)。这种样式看起来像 Fortran,在 R 中不需要它。
很难确切地说出你想要什么。 最好是示例是可重现的(我们可以复制/粘贴并运行,我们没有您的数据,因此不起作用)并且是最小的(您的代码中有很多我认为不涉及您的问题)。
但一些指示可能会有所帮助。
首先,readline
函数有一个prompt
参数,它将为你提供比print
语句更好看的交互。
如果所有数据都位于数据框中,其中 p 值和坡率的列p
和b
,则可以仅包含p<=0.05
简单子集的b
值,例如:
hist( mydataframe$b[ mydataframe$p <= 0.05 ] )
或
with( mydataframe, hist(b[p<=0.05]) )
这足以回答你的问题吗?
鉴于data = cbind(slopes, pvalues)
(所以col(data) == 2
)
喜欢这个:
plot(data[data[ ,2] < 0.05 , ])
解释:
data[ ,2] < 0.05
将返回一个 TRUE/FALSE 向量,其中包含列的长度。
因此,您将获得:
data[c(TRUE, FALSE....), ]
从那里开始,只有数据才会被选择在它显示 TRUE 的地方。
因此,您将仅绘制 pvalue 低于 0.05 的 x 和 y。
以下是仅绘制具有有效 p 值的斜率数据点的代码:假设文件的列名将是 pval 和斜率。
# Prompt a message on the Terminal
filename <- readline("Enter the file name that have p-value and slopes (include .csv)")
# Read the filename from the terminal
file <- read.csv(filename, header = TRUE)
# Prompt a message again on the Terminal and read the acceptance from user
pval_filter <- readline("Only include trials with p-value < .05? (enter yes or no)")
if (to-lower(pval_filter) == "yes"){
# Create a filtered file that contain only rows with the p-val less than that of siginificatn p-val 0.05
file.filtered <- file[file$pval < 0.05, ]
# Get the title of the Histogram to be drawn for the slopes (filtered)
hist.title <- readline("State the title of the histogram")
# Draw histogram for the slopes with the title
# las = 2 parameter in the histogram below makes the slopes to be written in parpendicular to the X-axis
# so that, the labels will not be overlapped, easily readable.
hist(file.filtered$slope, main = hist.title, xlab = Slope, ylab = frequency, las = 2)
}
希望这会有所帮助。