2016-02-24 74 views
0

我有這樣給值在data.frame特定行中的R

    names     ranges   strand 
1        [  1, 3073252]    + 
2  ENSMUSG00000102693  [3073253, 3074322]    + 
3        [3074323, 3102015]    + 
4  ENSMUSG00000102693  [3102016, 3102125]    + 
5        [3102126, 3252756]    + 
6  ENSMUSG00000095366  [90667525, 90667625]    - 
7        [90667626, 90754512]    - 
8  ENSMUSG00000095366  [90754513, 90754821]    - 
9        [90754822, 90838868]    - 
10  ENSMUSG00000096850  [90838869, 90839177]    - 

但只是一些行的表中有「名」。我想在下面的「名稱」列中給出一個值: 如果2行(2和4)中的「名稱」相同,則中間行(3)將該名稱與「新」相加:

例如:

    names     ranges   strand 
1        [  1, 3073252]    + 
2  ENSMUSG00000102693  [3073253, 3074322]    + 
3  ENSMUSG00000102693_new [3074323, 3102015]    + 
4  ENSMUSG00000102693  [3102016, 3102125]    + 
5        [3102126, 3252756]    + 
6  ENSMUSG00000095366  [90667525, 90667625]    - 
7  ENSMUSG00000095366_new [90667626, 90754512]    - 
8  ENSMUSG00000095366  [90754513, 90754821]    - 
9        [90754822, 90838868]    - 
10  ENSMUSG00000096850  [90838869, 90839177]    - 

謝謝。

+2

使用'dput(mydata)'會更好的重現性 –

+0

爲什麼有些行在預期中仍然是空白的? – akrun

回答

2

使用leadlag另一種可能的解決方案:

library(dplyr) 
names <- c('', 'ENSMUSG00000102693', '', 'ENSMUSG00000102693', '', 'ENSMUSG00000095366', '', 'ENSMUSG00000095366', '', 'ENSMUSG00000096850') 
df <- data.frame(names) 
df$names <- as.character(df$names) 
df$names <- ifelse((lag(df$names, default = '1') == lead(df$names, default = '2')) & (lag(df$names, default = '1') != ''), paste0(lag(df$names), '_new'), df$names) 
##     names 
##1       
##2  ENSMUSG00000102693 
##3 ENSMUSG00000102693_new 
##4  ENSMUSG00000102693 
##5       
##6  ENSMUSG00000095366 
##7 ENSMUSG00000095366_new 
##8  ENSMUSG00000095366 
##9       
##10  ENSMUSG00000096850 

對於每個條目,它會檢查是否以前的值和下一個值是相同的,而且它們不是空的字符串。如果條件滿足,它將複製以前的值並將_new添加到它。

1

na.locf是這裏的可能性:

x <- c("a", NA, "a", NA, "b") 
library(zoo) 

fun <- function(x) { 
    y <- na.locf(x) #last observation carried forward 
    z <- na.locf(x, fromLast = TRUE) #last observation carried backward 
    x[y == z] <- y[y == z] 
    x 
} 

x1 <- fun(x) 
#[1] "a" "a" "a" NA "b" 
x1[is.na(x) & !is.na(x1)] <- paste0(x1[is.na(x) & !is.na(x1)], "_new") 
#[1] "a"  "a_new" "a"  NA  "b"