Размещение значений строки в столбцах на основе соответствующей метки строки - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть два столбца во фрейме данных, один - «Диаметр», другой - «Ясень».Я пытаюсь переместить эти два столбца в несколько столбцов на основе метки в столбце пепла.Это должно быть просто, но прошло уже много времени с тех пор, как я использовал R.

X Diameter Ash  
1 0.566176 Apache
2 0.588312 Apache
3 0.590499 Tolk
4 0.607365 Belle Isle
5 0.631185 Tolk

Я бы хотел, чтобы это выглядело так:

X Apache Belle Isle Tolk
1 0.566  0.607      0.590
2 0.588  N/A        0.631

Ответы [ 4 ]

0 голосов
/ 17 февраля 2019

Использование plyr ldply с split

df=plyr::ldply(split(x$Diameter,x$Ash), rbind)
row.names(df)=df$.id
df$.id=NULL
df=data.frame(t(df))
df
  Apache Belle.Isle Tolk
1   0.56        0.6 0.59
2   0.58         NA 0.63
0 голосов
/ 17 февраля 2019

Мое решение группирует данные по Ash, создает новую переменную с помощью row_number () и затем распространяет данные.

library(tidyverse)

x <- tibble(X= c(1:5),
            Diameter = c(0.56,0.58,0.59,0.60,0.63),
            Ash = c("Apache", "Apache", "Tolk", "Belle Isle","Tolk"))

df_2 <- x %>%select(-X) %>%
    arrange(Ash) %>%
    group_by(Ash) %>%
    mutate(row = row_number()) %>% 
    spread(Ash, Diameter)

df_2
0 голосов
/ 17 февраля 2019

Мы можем использовать функцию spread.

data2 <- data %>% 
  spread(key=Ash, value=Diameter)

Это, однако, генерирует 5 строк данных;поэтому мы перемещаем все значения вверх и нажимаем NA s, используя функцию ниже ( из этого ответа SO здесь ) и отфильтровываем все строки со всеми NA s, так что в итоге получается только две строки в этомcase.

move_vals_up <- function(x) {
  num.na <- sum(is.na(x))
  x <- x[!is.na(x)]
  x <- c(x, rep(NA, num.na))
  return(x)
}
as.data.frame(lapply(data2, move_vals_up)) %>% 
  filter(rowSums(!is.na(.)) > 1)

Выход:

  X   Apache Belle.Isle     Tolk
1 1 0.566176   0.607365 0.590499
2 2 0.588312         NA 0.631185
0 голосов
/ 17 февраля 2019

Вы можете сначала изменить свой фрейм данных на матрицу, а затем использовать функции транспонирования, но это, вероятно, не то, что вам нужно, потому что тогда каждая запись будет приведена к строковым значениям.Поскольку ваш фрейм данных очень мал, я бы порекомендовал самый простой способ:

rbind(df$Ash, df$Diameter)

Где df - имя вашего фрейма данных

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