Выбор непоследовательных столбцов в таблицах R

Скажем, у меня есть некоторая таблица T. Предположим, что T имеет 5 столбцов. Я понимаю, как выбрать любое последовательное подмножество столбцов и сохранить их как новую таблицу. Для этого я бы использовал скобки и двоеточие справа от запятой:

newT <- T[,2:4]   # creates newT from columns 2 through 4 in T

Но как выбрать непоследовательные столбцы для подмножества? Допустим, я хочу выбрать столбец 1 и столбец 3? Как мне это сделать? Другой тип выбора, который я, возможно, захочу сделать, но не знаю, как это сделать, — это выбор случайных столбцов из таблицы T.


r
person user938301    schedule 17.11.2011    source источник
comment
Присвоение объектам имен «T» (или «F») может привести к проблемам в будущем — лучше этого избегать. Также в R есть есть таблицы, но я предполагаю, что у вас действительно есть фрейм данных или матрица.   -  person Patrick Burns    schedule 18.11.2011


Ответы (4)


Вы просто сначала создаете нужные вам индексы. Функция c позволяет объединять значения. Значения могут быть либо индексами столбцов, либо именами столбцов (но не смешанными).

df <- data.frame(matrix(runif(100), 10))
cols <- c(1, 4:8, 10)
df[,cols]

Вы также можете выбрать индексы столбцов для удаления, указав отрицательный индекс:

df[, -c(3, 5)] # all but the third and fifth columns
person Tommy    schedule 17.11.2011
comment
Как реализовать что-то подобное? val <- 6 cols <- c(1, c(val-4:val-1)) df[,cols] - person Parisa Rai; 23.01.2017

Если я правильно понял ваш вопрос, вы должны попробовать что-то похожее на следующее:

df1 = data.frame(state=c("KS","CO","CA","FL","CA"), value=c(1,2,3,7,9))
df1

df1[c(c(1,3),4:5),]
df1[c(1,3,4:5),]
person ATMathew    schedule 17.11.2011
comment
Мне очень нравится, насколько лаконичным является ваше решение, заключающееся в том, что все это содержится в одной команде с помощью функции c. Однако ваше решение использует подмножества для непоследовательных строк, тогда как вопрос выше спрашивает, как выполнить подмножество для непоследовательных столбцов, что для примера фрейма данных df <- data.frame(matrix(runif(100), 10)) будет выглядеть так df[,c(1,3,4:5)] - person coip; 27.05.2016

Для случайных столбцов проверьте ?sample

df <- data.frame(matrix(runif(25), 5))
df
#         X1        X2         X3         X4        X5
#1 0.7973941 0.6142358 0.07211461 0.01478683 0.6623704
#2 0.8992845 0.8347466 0.54495115 0.52242817 0.4944838
#3 0.8695551 0.9228987 0.00838420 0.58049324 0.9256282
#4 0.1559048 0.7116077 0.08964883 0.06799828 0.3752833
#5 0.2179599 0.4533054 0.60817319 0.62235228 0.8357441

df[ ,sample(names(df), 3)]
#         X5         X3        X2
#1 0.6623704 0.07211461 0.6142358
#2 0.4944838 0.54495115 0.8347466
#3 0.9256282 0.00838420 0.9228987
#4 0.3752833 0.08964883 0.7116077
#5 0.8357441 0.60817319 0.4533054
person Grau    schedule 17.11.2011

Вы также можете использовать логические значения. Например. df[c(TRUE,FALSE,TRUE)] выбирает первый и третий столбец. Логический вектор должен иметь количество или элементы, равные количеству столбцов во фрейме данных, в противном случае его элементы реплицируются до количества столбцов.

person Luke    schedule 15.01.2020