2016-08-04 75 views
0

我有一個數據幀,示例如下。從R數據框的列中替換部分值

 chr start2  end2 value 
88 chrom16 56063633 56063634 0.238 
78 chrom12 83039622 83039623 0.429 
50 chrom12 73209081 73209082 0.313 
68 chrom12 75138610 75138611 0.679 
45 chrom12 67566601 67566602 0.859 
120 chrom16 57694245 57694246 0.438 

我想更改列中的部分值。在這個數據幀,我想在列變「CHROM」到「CHR」 2.

輸出應該看起來像

 chr start2  end2 value 
88 chr16 56063633 56063634 0.238 
78 chr12 83039622 83039623 0.429 
50 chr12 73209081 73209082 0.313 
68 chr12 75138610 75138611 0.679 
45 chr12 67566601 67566602 0.859 
120 chr16 57694245 57694246 0.438 
+0

使用'子( 「({3}){2}(\\ d +)」, 「\\ 1 \\ 2」,DF1 $ chr)' – akrun

回答

1

如果它的模式很簡單,只要在你的榜樣,你只需更換「chrom」中的「om」字符串爲空。

df <- read.table(text = " chr start2  end2 value 
           88 chrom16 56063633 56063634 0.238 
           78 chrom12 83039622 83039623 0.429 
           50 chrom12 73209081 73209082 0.313 
           68 chrom12 75138610 75138611 0.679 
           45 chrom12 67566601 67566602 0.859 
           120 chrom16 57694245 57694246 0.438", header = TRUE) 

df$chr <- sub("om", "", df$chr) 

df 
#   chr start2  end2 value 
# 88 chr16 56063633 56063634 0.238 
# 78 chr12 83039622 83039623 0.429 
# 50 chr12 73209081 73209082 0.313 
# 68 chr12 75138610 75138611 0.679 
# 45 chr12 67566601 67566602 0.859 
# 120 chr16 57694245 57694246 0.438 
+0

它可以工作,但是,編輯後的列在值後放置爲新列。 – panbar

+0

@panbar你剛剛複製我的代碼?因爲它不應該發生,因爲你只是替換舊列中的值。沒有新的列被創建。 – Alex

+0

謝謝。有效。 – panbar

1

我們可以使用sub捕獲前3個字符爲一組,然後通過匹配2個字符,然後捕獲的數字,與反向引用(\\1\\2對於所捕獲的基團)取代它。如果字符串元素改變

df1$chr <- sub("(.{3}).{2}(\\d+)", "\\1\\2", df1$chr) 
df1$chr 
#[1] "chr16" "chr12" "chr12" "chr12" "chr12" "chr16" 

或者我們也可以使用lookarounds

sub(".{2}(?=\\d)", "", df1$chr, perl = TRUE) 
#[1] "chr16" "chr12" "chr12" "chr12" "chr12" "chr16" 

這也應該工作。

或者另一個更快的選項是substr根據字符的位置。

df1$chr <- with(df1, paste0(substr(chr, 1, 3), substr(chr, 6,7))) 
df1$chr 
#[1] "chr16" "chr12" "chr12" "chr12" "chr12" "chr16" 
0

兩種可能的方式:

data <- read.table(text = 'chr  start2 end2  value 
          chrom16 56063633 56063634 0.238 
          chrom12 83039622 83039623 0.429 
          chrom12 73209081 73209082 0.313 
          chrom12 75138610 75138611 0.679 
          chrom12 67566601 67566602 0.859 
          chrom16 57694245 57694246 0.438', 
        stringsAsFactors = FALSE, 
        header = TRUE) 

# stringr package + base R for assignment 
library(stringr) 
data['chr'] <- str_replace(data[['chr']], "chrom", "chr") 

data 
# chr start2  end2 value 
# 1 chr16 56063633 56063634 0.238 
# 2 chr12 83039622 83039623 0.429 
# 3 chr12 73209081 73209082 0.313 
# 4 chr12 75138610 75138611 0.679 
# 5 chr12 67566601 67566602 0.859 
# 6 chr16 57694245 57694246 0.438 

# with stringr and dplyr packages 
library(dplyr) 
data <- 
    data %>% 
    mutate(chr = str_replace(chr, "chrom", "chr")) 

data 
# chr start2  end2 value 
# 1 chr16 56063633 56063634 0.238 
# 2 chr12 83039622 83039623 0.429 
# 3 chr12 73209081 73209082 0.313 
# 4 chr12 75138610 75138611 0.679 
# 5 chr12 67566601 67566602 0.859 
# 6 chr16 57694245 57694246 0.438