Как отображать определенные точки данных в столбце в сценарии R

Представьте, что есть два столбца, один для 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()
    }
}

person kevin ko    schedule 21.10.2013    source источник
comment
Каков твой вопрос?   -  person Señor O    schedule 22.10.2013


Ответы (4)


Разве это не намного короче и производит примерно то же самое:

df = read.csv('file.csv')
df = df[df$pval < 0.05,]
hist(df$value)

Это должно, по крайней мере, заставить вас начать.

Несколько замечаний по коду:

  • Вы используете много зарезервированных имен (var, file) в качестве имени объекта, это плохая идея.
  • Если вы хотите, чтобы программа работала с пользовательским вводом, вам нужно проверить его, прежде чем что-либо с ним делать.
  • Нет необходимости явно перебирать строки в data.frame, R векторизован (например, см., как я подмножил df выше). Этот стиль похож на Fortran, в R он не нужен.
person Paul Hiemstra    schedule 21.10.2013

Трудно сказать, чего именно вы хотите. Лучше всего, если пример воспроизводим (мы можем скопировать/вставить и запустить, у нас нет ваших данных, поэтому это не работает) и минимален (в вашем коде много такого, что, я думаю, не имеет отношения к вашему вопрос).

Но некоторые указатели, которые могут помочь.

Во-первых, функция readline имеет аргумент prompt, который обеспечивает более приятное взаимодействие, чем операторы print.

Если все ваши данные находятся во фрейме данных со столбцами p и b для p-значения и наклона, вы можете включить только значения b, для которых p<=0.05 с простым подмножеством, например:

hist( mydataframe$b[ mydataframe$p <= 0.05 ] )

or

with( mydataframe, hist(b[p<=0.05]) )

Этого достаточно, чтобы ответить на ваш вопрос?

person Greg Snow    schedule 21.10.2013
comment
да. это очень похоже на ответ выше, который работает. Спасибо! - person kevin ko; 23.10.2013

Учитывая, что data = cbind(slopes, pvalues) (так что col(data) == 2)

Как это:

plot(data[data[ ,2] < 0.05 , ])

Объяснение:

data[ ,2] < 0.05 вернет вектор TRUE/FALSE с длиной столбцов.

так что тогда вы получите:

data[c(TRUE, FALSE....), ]  

С этого момента будут выбраны только те данные, где указано TRUE.

Таким образом, вы будете отображать только те x и y, где pvalue меньше 0,05.

person PascalVKooten    schedule 21.10.2013

Вот код для построения только точек данных наклона со значительным 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)
}

Надеюсь, это поможет.

person Kumar    schedule 22.10.2013