2014-01-13 4 views
1

Я прочитал все записи «string to variable name», но ни одна из них не охватывала мою конкретную проблему. У меня есть список векторов (данные последовательности ДНК), сделанные с использованием пакета seqinr 'read.fasta'. У меня есть кадр данных вариантов и их местоположение, и я хочу преобразовать элементы вектора списка в местах, указанных в кадре данных, в их альтернативные значения. На индивидуальной основе, это может быть сделано с помощьюR конвертировать строку в имя переменной и заменить переменную

list$name[number] <- alternate.character 

# I tried 
for (i in 1:length(df$CHROM)) 
    if (is.na(df$Call[i])) {next} else {get(paste("test$",df$CHROM[i],"[",df$POS[i],"]",sep="")) <- df$Call[i]} 

# example data 
test <- list("One" = c("a","t","a","g","c"), 
       "Two" = c("g","a","t","t","a","c","a")) 
df <- data.frame("CHROM"=c(rep("One",2),rep("Two",3)), 
      "POS" = c(2,4,1,3,6), 
      "REF" = c("t","g","g","t","c"), 
      "ALT" = c("a","a","t","g","t"), 
      "Call" = c("T","A","G",NA,"T")) 

Но «получить» возвращает вектор элемент из списка и не позволяет мне назначить его в качестве варианта в родительском списке.

Я хочу список, чтобы перейти от

$One 
[1] "a" "t" "a" "g" "c" 

$Two 
[1] "g" "a" "t" "t" "a" "c" "a" 

в

$One 
[1] "a" "T" "a" "A" "c" 

$Two 
[1] "G" "a" "t" "t" "a" "T" "a" 

Для тестовых данных это не проблема, потому что вы можете просто сделать это индивидуально, но реальные данные составляет более 10000 последовательностей и более 100 000 вариантов. Бонусные баллы, если вы можете его векторизовать, у меня недостаточно опыта, чтобы применить функции, чтобы заставить его работать с информацией из списка и кадра данных в одно и то же время.

sessionInfo() 
R version 3.0.2 (2013-09-25) 
Platform: x86_64-pc-linux-gnu (64-bit) 

locale: 
[1] LC_CTYPE=en_GB.UTF-8  LC_NUMERIC=C    
[3] LC_TIME=en_GB.UTF-8  LC_COLLATE=en_GB.UTF-8  
[5] LC_MONETARY=en_GB.UTF-8 LC_MESSAGES=en_GB.UTF-8 
[7] LC_PAPER=en_GB.UTF-8  LC_NAME=C     
[9] LC_ADDRESS=C    LC_TELEPHONE=C    
[11] LC_MEASUREMENT=en_GB.UTF-8 LC_IDENTIFICATION=C  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] seqinr_3.0-7 

loaded via a namespace (and not attached): 
[1] tools_3.0.2 
+0

ли REF и АЛТ столбцов здесь неуместен? – Spacedman

+0

На самом деле, да, они не имеют отношения к этой части, извините, они раньше использовались для вызова символа «Вызов». – JeremyS

+0

Продолжая свой подход, смотрите что-то вроде 'for (i в seq_len (nrow (df))) {if (! Is.na (as.character (df $ Call [i]))) test [[as.character (df $ CHROM [i])]] [as.numeric (as.character (df $ POS [i]))] <- as.character (df $ Call [i])} '; 'test' –

ответ

1

Вы можете использовать sapply для выполнения этой задачи:

res <- sapply(names(test), function(x) { 
    tmp <- df[df$CHROM == x & !is.na(df$Call), ] 
    replace(test[[x]], tmp$POS, as.character(tmp$Call)) 
}) 


res 
# $One 
# [1] "a" "T" "a" "A" "c" 
# 
# $Two 
# [1] "G" "a" "t" "t" "a" "T" "a" 
+0

Это делает именно то, что я хочу. И это выглядит так просто. Спасибо. – JeremyS

Смежные вопросы