В R с матрицей:
one two three four
[1,] 1 6 11 16
[2,] 2 7 12 17
[3,] 3 8 11 18
[4,] 4 9 11 19
[5,] 5 10 15 20
Я хочу извлечь подматрицу, строки которой имеют столбец три = 11. То есть:
one two three four
[1,] 1 6 11 16
[3,] 3 8 11 18
[4,] 4 9 11 19
Я хочу сделать это без зацикливания. Я новичок в R, так что это, вероятно, очень очевидно, но документация часто бывает несколько краткой.
[ ]
ответами, и вы увидите это более четко.Ответы:
Это легче сделать, если вы конвертируете свою матрицу во фрейм данных с помощью as.data.frame (). В этом случае предыдущие ответы (с использованием подмножества или m $ three) будут работать, в противном случае - нет.
Чтобы выполнить операцию с матрицей , вы можете определить столбец по имени:
m[m[, "three"] == 11,]
Или по номеру:
m[m[,3] == 11,]
Обратите внимание: если совпадает только одна строка, результатом является целочисленный вектор, а не матрица.
источник
m[m[,3] == 11,,drop=FALSE]
df <- df[!which(df$ARID3A:df$YY1 == "U"),]
, здесь я хочу , чтобы удалить эти строки из моего ФРА , где диапазон колонка (ARID3A: YY1) содержит значение U .m <- matrix(1:20, ncol = 4) colnames(m) <- letters[1:4]
Следующая команда выберет первую строку матрицы выше.
subset(m, m[,4] == 16)
И это выберет последние три.
subset(m, m[,4] > 17)
В обоих случаях результатом будет матрица. Если вы хотите использовать имена столбцов для выбора столбцов, вам лучше преобразовать его в фрейм данных с помощью
Затем вы можете выбрать с помощью
mf[ mf$a == 16, ]
Или вы можете использовать команду подмножества.
источник
Я выберу простой подход, используя пакет dplyr.
Если фрейм данных - это data.
library(dplyr) result <- filter(data, three == 11)
источник
Подмножество - очень медленная функция, и я лично считаю ее бесполезной.
Я предполагаю , что у вас есть data.frame, массив, матрица с именем
Mat
сA
,B
,C
как имена столбцов; тогда все, что вам нужно сделать, это:В случае одного условия в одном столбце, скажем, столбец A
Mat[which(Mat[,'A'] == 10), ]
В случае нескольких условий в разных столбцах вы можете создать фиктивную переменную. Предположим, что условия таковы
A = 10
,B = 5
иC > 2
тогда мы имеем:aux = which(Mat[,'A'] == 10) aux = aux[which(Mat[aux,'B'] == 5)] aux = aux[which(Mat[aux,'C'] > 2)] Mat[aux, ]
При проверке преимущества в скорости с помощью
system.time
,which
метод оказывается в 10 раз быстрее, чемsubset
метод.источник
Если ваша матрица называется
m
, просто используйте:R> m[m$three == 11, ]
источник
df <- df[!which(df$ARID3A:df$YY1 == "U"),]
, здесь я хочу удалить те строки из моего df, где диапазон столбцов (ARID3A: YY1) содержит значениеU
Если набор данных называется данными, то все строки, удовлетворяющие условию, при котором значение столбца pm2.5> 300 могут быть получены:
данные [данные ['pm2.5']> 300,]
источник