【问题标题】:Split colums into rows , and change an especific column value for new rows in R将列拆分为行,并更改 R 中新行的特定列值
【发布时间】:2018-05-02 13:50:35
【问题描述】:

我有一个包含多个列的数据框,如下所示:

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

我想拆分第二列的值,新行有frequency = 0

我正在尝试使用 tidyr 包中的 separate(),但我无法更改新行中的 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

我正在尝试使用 tidyr 包中的 separate(),但我无法更改新行中的 frequency 列。

【问题讨论】:

  • 我看了那篇文章,但是他只想复制列上的所有值,我想更改一个。
  • 更改值的规则是什么? Alels 中的最终值是否总是获得新值? Alels 中可以有两个以上的值吗?另外,您可以dput您的数据以便在答案中使用它吗?
  • 是的,Alels 列可以有多个值,全部用 "," 分隔。我想拆分该值,对于第一个值,我想要原始频率,对于另一个值,我想将频率值设置为 0。规则是将第二个和更多值的频率设置为 0

标签: r


【解决方案1】:

这应该可行:

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 = ",")))

【讨论】:

  • 您必须勾选您最喜欢的解决方案。 ;-)
【解决方案2】:

不漂亮,但我认为它有效。

# 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 

【讨论】:

  • @Javierbertolchorro 不用担心。并为将其标记为重复而道歉。
  • 没问题,英语不是我的母语,我应该更好地解释我的问题!
【解决方案3】:

您的示例中的数据:

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, .),您还可以从包data.table中选择使用rbindlist()

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 2022-01-23
    • 1970-01-01
    • 2022-01-15
    • 2020-03-26
    • 2019-09-03
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多