首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将列拆分为行,并为R中的新行更改特定的列值

将列拆分为行,并为R中的新行更改特定的列值
EN

Stack Overflow用户
提问于 2018-05-02 21:50:36
回答 3查看 58关注 0票数 0

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

代码语言:javascript
运行
复制
 Frequency                 Alels
   0.5                      C
   0.6                      C,G
   0.02                     A,T,TTT

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

我尝试使用tidyr包中的separate(),但是我不能更改新行中的frequency列,我得到了上面的结果:

代码语言:javascript
运行
复制
Frequency                 Alels
   0.5                      C
   0.6                      C
   0.6                      G
   0.02                     A
   0.02                     T
   0.02                    TTT

但我希望输出如下所示:

代码语言:javascript
运行
复制
Frequency                 Alels
   0.5                      C
   0.6                      C
   0                        G
   0.02                     A
   0                        T
   0                        TTT

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

EN

回答 3

Stack Overflow用户

发布于 2018-05-02 22:11:31

这应该是可行的:

代码语言:javascript
运行
复制
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 = ",")))
票数 0
EN

Stack Overflow用户

发布于 2018-05-02 22:35:38

不是很好,但我觉得很管用。

代码语言:javascript
运行
复制
# 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)

原件:

代码语言:javascript
运行
复制
#    frequency   alels
# 1       0.5       C
# 2       0.6 C, G, T

结果:

代码语言:javascript
运行
复制
#    frequency alels
# 1       0.5     C
# 2       0.6     C
# 3       0.0     G
# 4       0.0     T

使用您的数据:

代码语言:javascript
运行
复制
#   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
EN

Stack Overflow用户

发布于 2018-05-02 22:45:10

您的示例中的数据:

代码语言:javascript
运行
复制
df <- read.table(text = " Frequency                 Alels
   0.5                      C
             0.6                      C,G
             0.02                     A,T,TTT",
            header = T, stringsAsFactors = F)

还有另一个需要你考虑的解决方案:

代码语言:javascript
运行
复制
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

您还可以选择使用data.table包中的rbindlist(),而不使用do.call(rbind, .)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50136311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档