Вопрос по r – R запрос на '$' ()

2

Я создал фрейм данных и пытаюсь получить доступ к столбцам в фрейме данных. Код, как показано ниже

<code>df <- data.frame(n = c('A','B','C'),
                 mark_1 = c(23,25, 17),
                 mark_2 = c(45,46,50))

j <- paste('mark',1,sep="_")
j

f <- '$'(df,j)
summary(f)

n <- '$'(df,"mark_1")
summary(n)
</code>

Когда я запускаю этот код, это то, что я получаю

<code>    > j <- paste('mark',1,sep="_")
    > j
    [1] "mark_1"
    > f <- '$'(df,j)
    > summary(f)
    Length  Class   Mode 
         0   NULL   NULL 
    > n <- '$'(df,"mark_1")
    > summary(n)
       Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      17.00   20.00   23.00   21.67   24.00   25.00 
    > 
</code>

Почему резюме (f) не работает? j должным образом соединен с "mark_1". Тогда почему происходит ошибка?

заранее спасибо

Почему бы не использовать индексацию как вdf[, j]? Tyler Rinker
Продолжая тот же вопрос, что и выше, у меня есть 2 связанных запроса: если у меня есть 100 переменных переменных, названных как mark_1, mark_2 до mark_100, есть ли более эффективный метод, чем использование for (i in 1: 100) {f & lt; - paste ( "mark", i, sep = "_") # здесь присутствует некоторый функциональный код #} Второй вопрос: если в столбце mark_6 отсутствует цикл for, он выходит после i = 5 без обработки от mark_7 до mark_100. Как мне справиться с этой проблемой? Спасибо wenge

Ваш Ответ

4   ответа
6

@TylerRinker показал вам, что делать вместо этого.

... но причина, по которой вы не можете использовать'$'(df,j) является то, что оператор доллара использует второй аргумент буквально.

...так'$'(df,mark_1) будет работать нормально. Но вы просто не можете передать ей переменную. Вот что[ а также[[ предназначены для:

df[,j]  # The j'th column
df[[j]] # Pretend df is a list of columns and get the j'th element
Хорошее объяснение. Я рано научился (возможно, из R Inferno) использовать индексирование, а не$ парень, потому что было меньше сюрпризов.
2

Вы можете использовать & quot; $ & apos; если вы применили его сdo.call. do.call полезно в ситуациях, когда у вас есть имя функции как символ, а не значение языка. В этом случае он также оценивает второй аргумент, список данных и имя столбца.

do.call('$', list(df, j))
[1] 23 25 17

Тем не менее, я думаю, что вам лучше использовать & apos; [[& apos; или "["; которые делают оценку второго аргумента как само собой разумеющееся.

5

Используйте индексирование над$ как в:

df[, j]
summary(df[, j])
Спасибо Тайлер - это сработало wenge
4

'$'(df,j) эквивалентноdf$j - он смотрит на название аргумента, а не его стоимость. Ты можешь использоватьdf[[j]] или жеdf[,j] или же'[['(df,j) вместо (но избегайте последнего, если вы не хотите сделать код трудным для чтения).

df$j <- 1

# The "j" column
df$j
`$`(df,j)
`[[`(df,"j")
df[["j"]]
df[,"j"]

# The "mark_1" column
df[[j]]
df[,j]
`[[`(df,j)

Похожие вопросы