заполнение пустых строк нулями в R - PullRequest
0 голосов
/ 22 марта 2019

Я использую R для подготовки data.frame, который позже будет использоваться в регрессии смешанных эффектов.Я довольно новичок в R, я пытался найти и найти решение для моей проблемы, но я не смог найти именно то, что я хочу.

У моего data.frame есть строки 20071, и я хочу добавитьновый столбец, но он имеет длину 1767, а мне нужно заполнить остальные нулями.Вот код:

data$M1 <- c(data$M1,(data$Mw[(data$Mw > 6.5)]-6.5))

, и я получаю эту ошибку:

Error in `$<-.data.frame`(`*tmp*`, "M1", value = c(0.0999999999999996,  : 


replacement has 1767 rows, data has 20071

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

Ответы [ 5 ]

2 голосов
/ 22 марта 2019

То, что вы делаете, - это извлечение данных, соответствующих вашим условиям (1767 строк), то есть вектор, который короче вашего числа строк в вашем фрейме данных.

Вместо этого следует использовать «ifelse».

data$M1 <- ifelse(data$Mw > 6.5,
                  data$Mw - 6.5,
                  0)

Если число больше 6,5, вы вычитаете 6,5 из числа, иначе вы возвращаете ноль.

0 голосов
/ 30 марта 2019

Вы можете сделать это:

data$M1 <- pmax(data$Mw - 6.5, 0)

Идея заключается в следующем: вы хотите создать вектор, содержащий data$Mw - 6.5, если не указано data$Mw < 6.5, и в этом случае вектор должен быть равен нулю. Это означает, что у вас будет ноль точно, когда data$Mw - 6.5 < 0. Таким образом, для каждого i ваш вектор будет содержать максимум data$Mw - 6.5 и 0.

Это именно то, для чего предназначена функция pmax(): она принимает несколько векторов в качестве входных данных и возвращает поэлементный максимум. Это легче всего увидеть на примере:

pmax(c(1, 4), c(3, 2))
[1] 3 4

Первое значение выхода соответствует max(1, 3), второе значение max(4, 2).

Это значительно быстрее, чем при использовании ifelse().

0 голосов
/ 22 марта 2019

Другой базовый способ R - сначала создать столбец, заполненный нулями, а затем использовать логический индекс.

data$M1 <- 0
data$M1[data$Mw > 6.5] <- data$Mw[data$Mw > 6.5] - 6.5

Вероятно, это быстрее.

0 голосов
/ 22 марта 2019

Используя cbind.fill() из библиотеки rowr, мы можем связать кадры / векторы данных разных размеров, заполняя отверстия желаемым fill.

  > a=as.data.frame(matrix(0,4,2),stringsAsFactors = FALSE)
  > a
      V1 V2
    1  0  0
    2  0  0
    3  0  0
    4  0  0
    > b=c(1,2,3)

    > cbind.fill(a,b,fill=0)
      V1 V2 object
    1  0  0      1
    2  0  0      2
    3  0  0      3
    4  0  0      0
0 голосов
/ 22 марта 2019

Это должно делать то, что вы хотите:

data$M1[1768:20071] <- 0

или, если M1 - отдельный вектор или столбец другого фрейма данных:

data$M1 <- c(M1, rep(0, 20071-1768))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...