Индексирование data.frames с использованием массивов ИСТИНА и ЛОЖЬ - PullRequest
0 голосов
/ 04 марта 2010

У меня проблемы с индексированием data.frames в R. Я новичок в R. У меня есть data.frame с именем d, который имеет 35512 столбцов и 77 строк. У меня есть список с именем rd, который содержит 35512 элементов. Я хотел бы, чтобы все столбцы d соответствовали элементам в rd меньше 100. Вот что я делаю:

# just to prove I'm not crazy
> length(colnames(d))
[1] 35512
> length(rownames(d))
[1] 77
> length(rd)
[1] 35512
# find all the elements of rd less than 100 (+ unnecessary faffing?)
> i <- unlist(rd<100)
> names(i) <- NULL
# try to extract all the elements of d corresponding to rd < 100
> d <- d[,i]
Error in `[.data.frame`(d, , i) : undefined columns selected

Я действительно не хочу заниматься вещами unlist и names(i) <- NULL, но я становлюсь серьезно параноиком. Кто-нибудь может помочь с тем, что, черт возьми, означает это сообщение об ошибке?

Если это поможет, переменная rd создается с использованием следующего:

rd = lapply(lapply(d, range), diff)

Что, я надеюсь, говорит мне разницу в диапазоне каждого столбца d.

P.S. потрясающий бонус для тех, кто может сказать мне команду, чтобы найти форму data.frame, кроме запроса длины его имени строки и столбца.

Редактировать: Вот как выглядит rd:

> rd[1:3]
$`10338001`
[1] 7198.886

$`10338003`
[1] 4748.963

$`10338004`
[1] 3173.046

и когда я завершу свою работу, i выглядит так:

> i[7:10]
[1] FALSE FALSE FALSE  TRUE

Ответы [ 2 ]

1 голос
/ 04 марта 2010

Для бонуса Q вы получаете «форму» фрейма данных или матрицы, используя команду « dim ».

A = matrix( ceiling(10*runif(40)), nrow=8)
colnames(A) = c("col1", "col2", "col3", "col4", "col5")
df = data.frame(A)
b = ceiling(100*runif(5))

ndx = b < 50          
result = df[,ndx]     # just the columns of df corresponding to b < 50
1 голос
/ 04 марта 2010

Вы пробовали это:

d[,rd < 100]

Вот отдельный пример:

d <- data.frame(matrix(1:100, ncol=10))
rd <- as.list(1:10)
d[,rd < 5]

Чтобы получить форму информационного кадра, используйте nrow и ncol.

Edit:

Исходя из вашего ответа на мой NA вопрос, похоже, что в вашем индексе есть нелогичные значения, которые являются результатом пропущенных значений в вашем списке. Лучше всего сначала решить, как вы хотите обработать пропущенное значение. Затем разберитесь с ними с помощью функции is.na (здесь я приведу свой пример сверху):

rd[[3]] <- NA
d[,rd < 5]
# => Error in `[.data.frame`(d, , rd < 5) : undefined columns selected

Чтобы справиться с этим, я установлю это значение NA равным 0 (что означает, что соответствующий столбец будет включен в окончательный data.frame):

rd[is.na(rd)] <- 0
d[,rd < 5]

Вы должны решить для себя, что делать со значениями NA.

...