2016-02-20 3 views
0

Я довольно новичок в R и не смог ответить на Google. Вопрос в том, как я могу сказать, что R обрабатывает значение символьной строки как часть кода так, как это делает функция SAS resolve()?R - как оценить текстовую строку

Скажем, у меня есть кадр данных, содержащий числовые столбцы V1, ..., Vn и ровно n строк. Я хочу подытожить все «диагональные» элементы V = V1 [1] + V2 [2] ... + Vn [n], но n достаточно велико для ручного суммирования (ниже, n = 2 для простоты).

Я пытаюсь поставить строки «DAT $ V1 [1]», «DAT $ V2 [2]» в символьной С, а затем извлечь соответствующее числовое значение (все в шаге цикла):

> dat <- data.frame(V1 = c(2,3), V2 = c(7,11)) 
> dat 
    V1 V2 
    1 2 7 
    2 3 11 

V = 0 
for(i in 1:nrow(dat)) 
{ 
    C = paste('dat$V',format(i,trim=TRUE),'[',format(i,trim=TRUE),']', 
      sep="") 
    f = Xfun(C) 
    V = V + f 
} 

Что следует использовать вместо Xfun? Я попытался as.formula(), asOneSidedFormula(), получить («...») и некоторые другие, но очень важно, что Дат $ V1 не является объектом:

> exists("dat") 
[1] TRUE 
> exists("dat$V1") 
[1] FALSE 

Ваша помощь очень ценится ,

+0

Вы можете редактировать ваш вопрос заголовка, чтобы привлечь больше внимания на ваш вопрос. – hasumedic

+0

Я также предлагаю, чтобы '' 'data frame''' не был идеальным классом для вашего объекта. Порядок строк не должен быть важен для фрейма данных. Я думаю, вам нужна '' 'matrix''' (или' '' array'''). –

ответ

1

Если вы просто хотите, чтобы подвести диагональные элементы квадратной матрицы, просто сделать

dat <- data.frame(V1 = c(2,3), V2 = c(7,11)) 

sum(diag(as.matrix(dat))) 

Если вы хотите оценить текстовую строку в R, почитайте немного о Eval или сделать ? eavl в R.

Для вашей проблемы, вы можете сделать это:

dat <- data.frame(V1 = c(2,3), V2 = c(7,11)) 
dat 

V = 0 
for(i in 1:nrow(dat)) 
{ 
    C = paste('dat$V',format(i,trim=TRUE),'[',format(i,trim=TRUE),']', 
      sep="") 
    f = eval(parse(text=C)) 
    V = V + f 
} 
+0

Kumar, это работает для меня отлично. Большое спасибо, и у меня хороший день. –

0

Для завершения:

а) правильный ответ с помощью текстового синтаксический анализ и оценка

V = 0 
for(i in 1:nrow(dat)) 
{ C = paste('dat$V',as.character(i),'[',as.character(i),']', 
      sep='') 
    V = V + eval(parse(text=C)) 
} 

б) правильное действие СПЕЦИАЛЬНО для кадра данных - без необходимости оценки текста, но адресации столбцов кадров данных непосредственно по имени

V = 0 
for(i in 1:nrow(dat)) 
{ col = paste('V',as.character(i), 
       sep='') 
    V = V + dat[i,col] 
} 
Смежные вопросы