Удалить определенные строки, если полная строка содержит нули - PullRequest
0 голосов
/ 06 мая 2018

Вот пример моей проблемы с обозначением моей точки.

 Random <- sample(c("A","B","C","D","E","F","G"), size = 100, replace = 
 TRUE)
 Year <- sample(c(2000,2001,2002,2003,2004,2005), 100, TRUE)
 Value <- sample(c(1,2,3,4), 100, TRUE)

 data <- data.frame(Random,Year,Value)

Итак, я хочу удалить все строки, которые не меняют своих значений в течение года в # Table1, или, по крайней мере, вернуть мне только те строки из столбца Random в # Table2, которые это делают. Я пометил вам строки в этом примере, которые я хочу удалить, чтобы лучше понять мою проблему.

Ответы [ 4 ]

0 голосов
/ 06 мая 2018

Другой альтернативой является обработка данных в длинном формате, а затем изменение формы. Это лучший метод, потому что это дорогостоящее выполнение построчных операций над data.frames. Вот базовое решение R с использованием модифицированной версии набора данных Тима.

reshape(dat[ave(dat$count, dat$Random, FUN=var) != 0, ],
        direction="wide", idvar="Random", timevar="year")

Здесь ave(dat$count, dat$Random, FUN=var) выбирает значения dat$Random, которые имеют ненулевую дисперсию, возвращая TRUE. Результирующий вектор используется для подмножества data.frame, который затем широко преобразуется в желаемый формат с помощью функции reshape базовой R.

Возвращает

  Random count.2000 count.2001 count.2002 count.2003 count.2004 count.2005
1      A          1          0          2          1          4          5
5      E          2          3          0          0          1          1
6      F          0          0          1          0          0          0

Данные

dat <-
structure(list(Random = c("A", "B", "C", "D", "E", "F", "G", 
"A", "B", "C", "D", "E", "F", "G", "A", "B", "C", "D", "E", "F", 
"G", "A", "B", "C", "D", "E", "F", "G", "A", "B", "C", "D", "E", 
"F", "G", "A", "B", "C", "D", "E", "F", "G"), year = c(2000, 
2000, 2000, 2000, 2000, 2000, 2000, 2001, 2001, 2001, 2001, 2001, 
2001, 2001, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2003, 2003, 
2003, 2003, 2003, 2003, 2003, 2004, 2004, 2004, 2004, 2004, 2004, 
2004, 2005, 2005, 2005, 2005, 2005, 2005, 2005), count = c(1, 
1, 0, 2, 2, 0, 3, 0, 1, 0, 2, 3, 0, 3, 2, 1, 0, 2, 0, 1, 3, 1, 
1, 0, 2, 0, 0, 3, 4, 1, 0, 2, 1, 0, 3, 5, 1, 0, 2, 1, 0, 3)),
.Names = c("Random", "year", "count"), row.names = c(NA, -42L),
 class = "data.frame")
0 голосов
/ 06 мая 2018

Используя набор данных в ответе @TimBiegeleisen, следующее также сохранит только строки с как минимум одним другим значением.

df[apply(df[-1], 1, function(x) any(x[-1] != x[1])), ]
0 голосов
/ 06 мая 2018

Вот вариант с использованием rowMins/rowMaxs

library(matrixStats)
df[rowMins(as.matrix(df[-1])) != rowMaxs(as.matrix(df[-1])),]

Или с pmin/pmax

df[do.call(pmin, df[-1]) != do.call(pmax, df[-1]),]
#    Random X2000 X2001 X2002 X2003 X2004 X2005
#1      A     1     0     2     1     4     5
#5      E     2     3     0     0     1     1
#6      F     0     0     1     0     0     0
0 голосов
/ 06 мая 2018

Согласно вашей логике, строка должна быть предназначена для удаления, если значение никогда не изменяется. Это условие можно сформулировать как истинное, если минимальное и максимальное значения совпадают. Попробуйте это:

df <- data.frame(Random=c("A", "B", "C", "D", "E", "F", "G"),
                 `2000`=c(1,1,0,2,2,0,3),
                 `2001`=c(0,1,0,2,3,0,3),
                 `2002`=c(2,1,0,2,0,1,3),
                 `2003`=c(1,1,0,2,0,0,3),
                 `2004`=c(4,1,0,2,1,0,3),
                 `2005`=c(5,1,0,2,1,0,3), stringsAsFactors=FALSE)

df.target <- df[, !(names(df) %in% c("Random"))]
df[apply(df.target, 1, function(x) min(x)!=max(x)), ]

  Random X2000 X2001 X2002 X2003 X2004 X2005
1      A     1     0     2     1     4     5
5      E     2     3     0     0     1     1
6      F     0     0     1     0     0     0

Демо

Edit:

Если вы также хотите удалить строки в таблице 1, имена которых соответствуют строкам, которые удаляются во второй таблице, вы можете попробовать:

names.rm <- df$Random[apply(df.target, 1, function(x) min(x)==max(x))]
table1[!table1$Random %in% names.rm, ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...