R 在列中旋转包含冗余信息的行

R 在列中旋转包含冗余信息的行,r,R,请将一些数据按行排列,并使用R将这些行按列组织,如下所示: 这样做的目的是获得等位基因、效应和Obs系,这些等位基因、效应和Obs系由3行变为3列。 标记、性状、标记位点每三个品系相同,变化的是等位基因、效应和Obs 例如: 初始数据 data1 <-"tag Trait Marker Locus Site Allele Effect Obs ca-S10_17086845 ca S10_17086845 10 17086845 R 0.000001 54 ca-S10_17086845

请将一些数据按行排列,并使用R将这些行按列组织,如下所示:

这样做的目的是获得等位基因、效应和Obs系,这些等位基因、效应和Obs系由3行变为3列。 标记、性状、标记位点每三个品系相同,变化的是等位基因、效应和Obs

例如: 初始数据

data1 <-"tag Trait Marker Locus Site Allele Effect Obs
ca-S10_17086845 ca S10_17086845 10 17086845 R 0.000001  54
ca-S10_17086845 ca S10_17086845 10 17086845 A 3.489820   1
ca-S10_17086845 ca S10_17086845 10 17086845 G -0.017141 389
cf-S10_9890328  cf S10_9890328 10 9890328 R 0.000001 146
cf-S10_9890328  cf S10_9890328 10 9890328 G 4.367540   1
cf-S10_9890328  cf S10_9890328 10 9890328 A -0.010635 297"
data1 <-read.table(text=data1,header=T)
预期结果

data2 <- "Trait Marker Allele Ef1 Ef2 Ef3 Obs1 Obs2 Obs3
ca S10_17086845 R/A/G 0.000001 3.489820 -0.017141 54 1 389
cf S10_9890328 R/G/A 0.000001 4.367540 -0.010635 146 1 297"
data2 <-read.table(text=data2,header=T)
谢谢

您可以使用dplyr粘贴等位基因,还可以获得第一、第二和第三效果或Obs

library(dplyr)
data1 %>% group_by(Trait, Marker) %>% summarize( allele = paste(Allele, collapse="/"), ef1=first(Effect), ef2=nth(Effect,2) , ef3=nth(Effect,3) )

  Trait       Marker allele      ef1     ef2       ef3
1    ca S10_17086845  R/A/G 0.000001 3.48982 -0.017141
2    cf  S10_9890328  R/G/A 0.000001 4.36754 -0.010635
您可以使用dplyr粘贴等位基因,还可以获得第一、第二和第三效果或Obs

library(dplyr)
data1 %>% group_by(Trait, Marker) %>% summarize( allele = paste(Allele, collapse="/"), ef1=first(Effect), ef2=nth(Effect,2) , ef3=nth(Effect,3) )

  Trait       Marker allele      ef1     ef2       ef3
1    ca S10_17086845  R/A/G 0.000001 3.48982 -0.017141
2    cf  S10_9890328  R/G/A 0.000001 4.36754 -0.010635

可能有一种更简单的方法,但dplyr和tidyr的组合是有效的:

library(dplyr)
library(tidyr)
data3 <- data1 %>% 
          group_by(tag) %>% 
          mutate(obstag = paste0("Obs", seq_along(Obs)),  # Add markers
                 eftag = paste0("Ef", seq_along(Effect)),
                 altag = paste0("A", seq_along(Allele))) %>%
          spread(altag, Allele) %>%  # Switch from rows to columns 
          spread(obstag, Obs) %>% 
          spread(eftag, Effect) %>% 
          summarise_each(funs(unique(na.omit(.))), 1:Ef3) %>%  # Collapse into one row per tag 
          mutate(Allele = paste(A1, A2, A3, sep = "/")) %>% # paste alleles together
          select(-A1, -A2, -A3, -tag) # drop unwanted columns

可能有一种更简单的方法,但dplyr和tidyr的组合是有效的:

library(dplyr)
library(tidyr)
data3 <- data1 %>% 
          group_by(tag) %>% 
          mutate(obstag = paste0("Obs", seq_along(Obs)),  # Add markers
                 eftag = paste0("Ef", seq_along(Effect)),
                 altag = paste0("A", seq_along(Allele))) %>%
          spread(altag, Allele) %>%  # Switch from rows to columns 
          spread(obstag, Obs) %>% 
          spread(eftag, Effect) %>% 
          summarise_each(funs(unique(na.omit(.))), 1:Ef3) %>%  # Collapse into one row per tag 
          mutate(Allele = paste(A1, A2, A3, sep = "/")) %>% # paste alleles together
          select(-A1, -A2, -A3, -tag) # drop unwanted columns

您可以使用dplyr和tidyr尝试类似的方法,我们首先删除两个不相关的列tag和Site,我认为您应该在发布之前完成这项工作,以使想法更加清晰;然后通过性状、标记和位点组将等位基因、效应和Obs粘贴在一起进行总结。最后,将列效应和Obs分离到结果数据帧:

library(dplyr); library(tidyr);
data1 %>% select(-tag, -Site) %>% group_by(Trait, Marker, Locus) %>% 
          summarise_each(funs(paste(., collapse = "/"))) %>% 
          separate(Effect, into = paste("Eff", 1:3, sep = ""), sep = "/") %>% 
          separate(Obs, into = paste("Obs", 1:3, sep = ""), sep = "/")

# Source: local data frame [2 x 10]
# Groups: Trait, Marker [2]
# 
#    Trait       Marker Locus Allele     Eff1    Eff2      Eff3  Obs1  Obs2  Obs3
#   (fctr)       (fctr) (int)  (chr)    (chr)   (chr)     (chr) (chr) (chr) (chr)
# 1     ca S10_17086845    10  R/A/G 0.000001 3.48982 -0.017141    54     1   389
# 2     cf  S10_9890328    10  R/G/A 0.000001 4.36754 -0.010635   146     1   297

您可以使用dplyr和tidyr尝试类似的方法,我们首先删除两个不相关的列tag和Site,我认为您应该在发布之前完成这项工作,以使想法更加清晰;然后通过性状、标记和位点组将等位基因、效应和Obs粘贴在一起进行总结。最后,将列效应和Obs分离到结果数据帧:

library(dplyr); library(tidyr);
data1 %>% select(-tag, -Site) %>% group_by(Trait, Marker, Locus) %>% 
          summarise_each(funs(paste(., collapse = "/"))) %>% 
          separate(Effect, into = paste("Eff", 1:3, sep = ""), sep = "/") %>% 
          separate(Obs, into = paste("Obs", 1:3, sep = ""), sep = "/")

# Source: local data frame [2 x 10]
# Groups: Trait, Marker [2]
# 
#    Trait       Marker Locus Allele     Eff1    Eff2      Eff3  Obs1  Obs2  Obs3
#   (fctr)       (fctr) (int)  (chr)    (chr)   (chr)     (chr) (chr) (chr) (chr)
# 1     ca S10_17086845    10  R/A/G 0.000001 3.48982 -0.017141    54     1   389
# 2     cf  S10_9890328    10  R/G/A 0.000001 4.36754 -0.010635   146     1   297

我们可以用data.table轻松地完成这项工作。将“data.frame”转换为“data.table”setDTdata1,通过按“Trait”和“Marker”分组后将“Allele”粘贴在一起,创建“Allele1”列。然后,使用dcast将其重塑为“宽”格式。data.table::dcast与reformae2:dcast不同,因为它还可以接受多个value.var列


我们可以用data.table轻松地完成这项工作。将“data.frame”转换为“data.table”setDTdata1,通过按“Trait”和“Marker”分组后将“Allele”粘贴在一起,创建“Allele1”列。然后,使用dcast将其重塑为“宽”格式。data.table::dcast与reformae2:dcast不同,因为它还可以接受多个value.var列


谢谢,但我觉得这个命令对我的数据来说有点重。。。错误:无法分配大小为11282.6 GB的向量谢谢,但我认为这个命令对我的数据来说有点重。。。错误:无法分配大小为11282.6 Gb的向量我正在尝试遵循所有stackoverflow规则,因此,请原谅,我想知道为什么它给我画了一个点,以便我可以改进下一个问题我正在尝试遵循所有stackoverflow规则,因此,请原谅,我想知道为什么它给我画了一个点,以便我可以改进下一个问题