Разбить столбцы на строки и изменить конкретное значение столбца для новых строк в R - PullRequest
0 голосов
/ 02 мая 2018

У меня есть фрейм данных с несколькими столбцами следующим образом:

 Frequency                 Alels
   0.5                      C
   0.6                      C,G
   0.02                     A,T,TTT

И я хочу разделить значение второго столбца и новые строки имеют frequency = 0.

Я пытаюсь использовать separate() из пакета tidyr, но я не могу изменить столбец frequency в новых строках, и я получаю следующие результаты:

Frequency                 Alels
   0.5                      C
   0.6                      C
   0.6                      G
   0.02                     A
   0.02                     T
   0.02                    TTT

Но я хочу получить следующий вывод:

Frequency                 Alels
   0.5                      C
   0.6                      C
   0                        G
   0.02                     A
   0                        T
   0                        TTT

Я пытаюсь использовать separate() из пакета tidyr, но не могу изменить столбец frequency в новых строках.

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

Не красиво, но я думаю, что это работает.

# Create data frame 
df <- data.frame(frequency = c(0.5, 0.6),
                 alels = c("C", "C, G, T"),
                 stringsAsFactors = FALSE)

# Duplicate the alels column, separate rows 
# Requires magrittr, dplyr, tidyr
df %<>% 
  mutate(alels_check = alels) %>% 
  separate_rows(alels, sep = ",", convert = TRUE)  

# Check for dupes and set them to zero
df[duplicated(df$frequency, df$alels_check),]$frequency <- 0

# Remove the duplicated alels column
df %<>% select(-alels_check)

Оригинал:

#    frequency   alels
# 1       0.5       C
# 2       0.6 C, G, T

Результат:

#    frequency alels
# 1       0.5     C
# 2       0.6     C
# 3       0.0     G
# 4       0.0     T

Используя ваши данные:

#   frequency     alels
# 1      0.50         C
# 2      0.60      C, G
# 3      0.02 A, T, TTT

#   frequency alels
# 1      0.50     C
# 2      0.60     C
# 3      0.00     G
# 4      0.02     A
# 5      0.00     T
# 6      0.00   TTT 
0 голосов
/ 02 мая 2018

данные из вашего примера:

df <- read.table(text = " Frequency                 Alels
   0.5                      C
             0.6                      C,G
             0.02                     A,T,TTT",
            header = T, stringsAsFactors = F)

и еще одно решение для вас:

library(dplyr)

lapply(1:nrow(df), 
   function(row_num){
     s <- strsplit(df$Alels[row_num], ",") %>% unlist
     data.frame(Frequency = c(df$Frequency[row_num], rep(0,length(s)-1)),
                Alels = s)
     }) %>% do.call(rbind, .)
df

вместо do.call(rbind, .) вы также можете выбрать rbindlist() из пакета data.table

0 голосов
/ 02 мая 2018

Это должно работать:

d <- read.table(text = "Frecuency                 Alels
   0.5                      C
                0.6                      C,G",
                header = T, stringsAsFactors = F)

counts <- sapply(strsplit(d$Alels, split = ","), length)

data.frame("Frecuency" = unlist(lapply(seq_along(d$Frecuency),
                                       function(x) c(d$Frecuency[x], 
                                                     rep(0, counts[x] -1)))), 
           "Alels" = unlist(strsplit(d$Alels, split = ",")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...