От длинных до широких форматов только на основе двух колонок Rstudio - PullRequest
0 голосов
/ 23 ноября 2018

Это мой фрейм данных: My data frame

У меня есть фрейм данных из шести столбцов, и последний столбец содержит значения.Столбец «код» включает в себя s и d.столбец «Секс» включает M и F. И у меня есть две тысячи потомков в столбце «потомок».

seq parent code Sex offspring                     Value 

1   49032   s   M   J44010_CCG7YANXX_2_661_X4   -0.38455056

2   48741   s   M   J44010_CCG7YANXX_2_661_X4   0.10574340

3   48757   s   M   J44010_CCG7YANXX_2_661_X4   0.39572906

4   48465   d   f   J44010_CCG7YANXX_2_661_X4   0.43409006

5   48521   d   f   J44010_CCG7YANXX_2_661_X4   0.40337447

6   48703   d   f   J44010_CCG7YANXX_2_661_X4   -0.38148980

Родитель столбца содержит идентификаторы как для мужчин, так и для женщин.Я хочу, чтобы в столбце содержались идентификатор женщины / дамбы, код женщины / дамбы и пол женщины / дамбы, а также отдельно указывалось значение отца и дамбы.Таким образом, «ценность» будет разделена на две части.

Фрейм данных будет выглядеть следующим образом:

'seq''parent1''sirecode''Sex''parent2''damcode''Sex''offspring''sireValue' 'damvalue'

  1    49032      s       M    48465     d       f    J44010  -0.38455056  0.43409006

  2    48741      s       M    48521     d       f    J44010   0.10574340   0.40337447

  3    48757      s       M    48703     d       f    J44010   0.39572906   -0.38148980

Таким образом, у каждого потомства будет 3 или 4 пары родителей.
Я пытался использовать функцию dcast.

1 Ответ

0 голосов
/ 23 ноября 2018

Мы можем использовать dcast после создания столбца последовательности

library(data.table)
setDT(df1)[, n := seq_len(.N), .(code, Sex)]
dcast(df1, n + offspring ~ rowid(n), value.var = c('parent', 'code', 'Sex', 'Value'), sep = "")
#  n                 offspring parent1 parent2 code1 code2 Sex1 Sex2     Value1     Value2
#1: 1 J44010_CCG7YANXX_2_661_X4   49032   48465     s     d    M    f -0.3845506  0.4340901
#2: 2 J44010_CCG7YANXX_2_661_X4   48741   48521     s     d    M    f  0.1057434  0.4033745
#3: 3 J44010_CCG7YANXX_2_661_X4   48757   48703     s     d    M    f  0.3957291 -0.3814898

В base R, мы можем использовать reshape

df1$n <- with(df1, ave(seq_along(Sex), Sex, FUN = seq_along))
df1$n1 <- with(df1, ave(n, n, FUN = seq_along))
reshape(df1[-1], idvar = c('n', 'offspring'), timevar = 'n1', direction = 'wide' )

data

df1 <- structure(list(seq = 1:6, parent = c(49032L, 48741L, 48757L, 
48465L, 48521L, 48703L), code = c("s", "s", "s", "d", "d", "d"
), Sex = c("M", "M", "M", "f", "f", "f"), 
  offspring = c("J44010_CCG7YANXX_2_661_X4", 
"J44010_CCG7YANXX_2_661_X4", "J44010_CCG7YANXX_2_661_X4", 
  "J44010_CCG7YANXX_2_661_X4", 
"J44010_CCG7YANXX_2_661_X4", "J44010_CCG7YANXX_2_661_X4"), 
   Value = c(-0.38455056, 
0.1057434, 0.39572906, 0.43409006, 0.40337447, -0.3814898)),
 class = "data.frame", row.names = c(NA, -6L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...