2016-10-20 4 views
3

Я новичок в программировании в R (или вообще), и я застрял на проблеме в течение нескольких дней. Извините, если этот вопрос уже существует в той или иной форме, но я выгляжу как можно лучше и не могу ничего найти.Подмножество данных с назначением Функция в R

У меня есть несколько наборов данных, которые называются pop1, pop2, pop3 и т. Д., И я пытаюсь присвоить значение нуль указанному подмножеству изнутри цикла for. Методом проб и ошибок, я обнаружил, что код:

subset(get(paste("pop", 1, sep = "")), ind == 46, select = -ind) 

возвращает подмножество Я искал, но когда я пытаюсь:

for (i in 1:3) { 
    assign(subset(get(paste("pop", i, sep = "")), ind == 46, select = -ind), 0) 
} 

Я получаю сообщение об ошибке:

#Error in assign(subset(get(paste("pop", i, sep = "")), ind == 46, select = -ind), : 
    #invalid first argument 

мне кажется, что функция правопреемника не будет принимать подмножества в качестве первого аргумента, поскольку ни одна из следующих работ либо:

assign(pop1[46, -1], 0) 
assign(pop1$trait1, 0) 
assign(subset(pop1, ind == 46), 0) 

Есть ли способ, которым я могу сделать эту работу? Большое спасибо, и дайте мне знать, будет ли полезной дополнительная информация.

+2

Поместите все всплывающие окна в объект списка, а затем используйте lapply, чтобы избежать проблем с «получить назначение». – zx8754

+1

Один трюк заключается в создании командной строки и использовании 'eval (parse (text = thetext))'. 'a <- matrix (1: 6,3,2)', а затем 'eval (parse (text = sprintf ("% s [% d,% d] <- 0 "," a ", 1,1))) '. Трудно набирать R-коды на смартфоне. – chan1142

ответ

2

Как уже упоминалось в комментариях, его легче выполнять эту задачу через список.

Вы можете хранить все свои наборы данных в списке. Затем, используя регулярную подстановку, вы можете выполнять регулярные задания.

df1=data.frame(a=1:10,b=c(1,2)) 
df2=data.frame(a=1:10,b=c(1,2)) 
l=list(df1,df2) 
lapply(l, function(x) { x[which(x[,2]==1),2]=999; return(x)}) 

Если вам нравится делать это в цикле, можно использовать синтаксический анализ вместе с eval.

for(i in 1:2){ 
    txt=paste('df',i,'[df',i,'[,2]==1,2]','=999', sep = "") 
    eval(parse(text = txt)) 
} 
+0

Большое спасибо! Я не мог получить работу, чтобы работать за то, что мне было нужно, потому что у меня было много других вещей, которые продолжались в цикле for, которые я не мог заставить работать внутри, (я не говорю, что это было невозможно, но я не удалось), но теперь у меня есть код для моей первоначальной цели, создав функцию для подмножества данных, поэтому очень спасибо! –

+0

Я понимаю, что вы относитесь к этому. Итак, вот цикл for, с которым вы можете работать. –

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