Как создать фрейм данных только с несколькими строками из другого фрейма с именами столбцов? - PullRequest
0 голосов
/ 14 июня 2019

Я работаю над блестящим R-приложением, в котором мне нужно проанализировать CSV-файлы. Из них я строю фрейм данных. Затем я хочу извлечь некоторые строки из этого информационного кадра и поместить их в другой информационный кадр.

Я нашел способ сделать это с помощью rbind, но он довольно уродливый и кажется неадекватным.

function(set){ #set is the data.frame containing the data I want to extract
  newTable <- data.frame(
    name = character(1),
    value = numeric(1),
    columnC = character(1),
    stringsAsFactors=FALSE)
  threshold <- 0

  for (i in 1:nrow(set)){

    value <- calculateValue(set$Value[[i]])) 
    if (value >= threshold){

      name <- set[which(set$Name == "foo")), ]$Name
      columnC <- set[which(set$C == "bar")), ]$C

      v <- c(name, value, columnC)

      newTable <- rbind(newTable, v)
    }
  }

Если я не инициализирую значения моего кадра данных с character(1) или numeric(1), я получаю ошибку:

Предупреждение: ошибка в data.frame: аргументы подразумевают различное число строки: 0, 1 75: остановка 74: data.frame

Но тогда в моем фрейме данных остается пустая строка (пустые строки для символов и 0 для чисел).


Поскольку R - классный язык, я полагаю, что сделать это проще и эффективнее. Кто-нибудь может мне помочь?

1 Ответ

1 голос
/ 14 июня 2019

Вместо того, чтобы циклически проходить по каждой строке, вы можете либо задать подмножество

function(set, threshold) {
    set[calculateValue(set$Value) >= threshold, c("name", "value", "columnC")]
}

, либо использовать dplyr, чтобы отфильтровать строки и выбрать столбцы, чтобы получить нужное подмножество.

library(tidyverse)
function(set, threshold) {
    set %>%
    filter(calculateValue(Value) >= threshold) %>%
    select(name, value, columnC)
}

Затем присвойте результат новой переменной, если вы хотите новый фрейм данных

getValueOverThreshold <- function(set, threshold) {
    set %>%
    filter(calculateValue(Value) >= threshold) %>%
    select(name, value, columnC)
}

newDF <- getValueOverThreshold(set, 0)

Возможно, вы захотите проверить https://r4ds.had.co.nz/transform.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...