2014-08-06 2 views
0

У меня есть следующий фрейм данных, сохраненный как .csv, который является результатом моего предыдущего кода. Value1_Cum - это совокупная сумма значения 1 для каждого ОБРАЗЦА. Он также доступен здесь: https://dl.dropboxusercontent.com/u/16277659/SAMPLE_rs.csvR: Удаление строк на основе шаблона

SAMPLE;  ID;  REFERENCE_YEAR; VALUE1; VALUE1_CUM 
SAMPLE1; 112; 1956;   0;  0 
SAMPLE1; 112; 1957;   200; 200 
SAMPLE1; 112; 1958;   NA; NA 
SAMPLE1; 112; 1959;   NA; NA 
SAMPLE1; 112; 1960;   NA; NA 
SAMPLE1; 112; 1963;   NA; NA 
SAMPLE2; 137; 1878;   0;  0 
SAMPLE2; 137; 1879;   -7900; -7900 
SAMPLE2; 137; 1880;   NA; NA 
SAMPLE2; 137; 1881;   NA; NA 
SAMPLE2; 137; 1882;   NA; NA 
SAMPLE2; 137; 1890;   NA; NA 
SAMPLE2; 137; 1891;   NA; NA 
SAMPLE2; 137; 1892;   -4300; -12200 
SAMPLE2; 137; 1893;   NA; NA 
SAMPLE2; 137; 1894;   NA; NA 
SAMPLE3; 136; 1971;   0;  0 
SAMPLE3; 136; 1972;   NA; NA 
SAMPLE3; 136; 1973;   NA; NA 
SAMPLE3; 136; 1974;   NA; NA 
SAMPLE3; 136; 1975;   NA; NA 
SAMPLE3; 136; 1976;   NA; NA 
SAMPLE3; 136; 1980;   NA; NA 
SAMPLE4; 0;  2000;    0; 0 
SAMPLE4; 0;  2001;   NA; NA 
SAMPLE4; 0;  2002;   NA; NA 
SAMPLE4; 0;  2003;   NA; NA 
SAMPLE4; 0;  2004;   500; 500 
SAMPLE4; 0;  2005;   NA; NA 
SAMPLE4; 0;  2006;   NA; NA 

Для обработки данных дополнительно нужно удалить все строки для всей выборки, которая содержит образец с 0, а затем следует НС (в этом примере sample3 должен получить удален). Если значение находится между значением NA для всего SAMPLE (например, в SAMPLE2), строки должны храниться. Кто-нибудь есть идея, как я могу это сделать?

SAMPLE;  ID;  REFERENCE_YEAR; VALUE1; VALUE1_CUM 
SAMPLE1; 112; 1956;   0;  0 
SAMPLE1; 112; 1957;   200; 200 
SAMPLE1; 112; 1958;   NA; NA 
SAMPLE1; 112; 1959;   NA; NA 
SAMPLE1; 112; 1960;   NA; NA 
SAMPLE1; 112; 1963;   NA; NA 
SAMPLE2; 137; 1878;   0;  0 
SAMPLE2; 137; 1879;   -7900; -7900 
SAMPLE2; 137; 1880;   NA; NA 
SAMPLE2; 137; 1881;   NA; NA 
SAMPLE2; 137; 1882;   NA; NA 
SAMPLE2; 137; 1890;   NA; NA 
SAMPLE2; 137; 1891;   NA; NA 
SAMPLE2; 137; 1892;   -4300; -12200 
SAMPLE2; 137; 1893;   NA; NA 
SAMPLE2; 137; 1894;   NA; NA 
SAMPLE4; 0;  2000;    0; 0 
SAMPLE4; 0;  2001;   NA; NA 
SAMPLE4; 0;  2002;   NA; NA 
SAMPLE4; 0;  2003;   NA; NA 
SAMPLE4; 0;  2004;   500; 500 
SAMPLE4; 0;  2005;   NA; NA 
SAMPLE4; 0;  2006;   NA; NA 
+0

Параметр '' '' 0''' в '' sample1, появляется '' 'будет сопровождаться числом, а не НС. Почему это исключено? – rsoren

+0

, конечно, вы правы! Я просто скопировал некоторые данные из моего результирующего фрейма данных, и это было неправильно, извините. единственным примером здесь, который нужно удалить, должен быть SAMPLE3. – kurdtc

+0

Вы имеете в виду, что ноль должен находиться в столбце «VALUE1» или «VALUE1_CUM»? Нужен ли нуль в определенном столбце? –

ответ

1

Вот data.table решения.

Набор данных:

df <- structure(list(SAMPLE = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L), .Label = c("SAMPLE1", "SAMPLE2", 
"SAMPLE3", "SAMPLE4"), class = "factor"), ID = c(112L, 112L, 
112L, 112L, 112L, 112L, 137L, 137L, 137L, 137L, 137L, 137L, 137L, 
137L, 137L, 137L, 136L, 136L, 136L, 136L, 136L, 136L, 136L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L), REFERENCE_YEAR = c(1956L, 1957L, 1958L, 
1959L, 1960L, 1963L, 1878L, 1879L, 1880L, 1881L, 1882L, 1890L, 
1891L, 1892L, 1893L, 1894L, 1971L, 1972L, 1973L, 1974L, 1975L, 
1976L, 1980L, 2000L, 2001L, 2002L, 2003L, 2004L, 2005L, 2006L 
), VALUE1 = c(0, 200, NA, NA, NA, NA, 0, -7900, NA, NA, NA, NA, 
NA, -4300, NA, NA, 0, NA, NA, NA, NA, NA, NA, 0, NA, NA, NA, 
500, NA, NA), VALUE1_CUM = structure(c(3L, 6L, 5L, 5L, 5L, 5L, 
3L, 1L, 5L, 5L, 5L, 5L, 5L, 2L, 5L, 5L, 3L, 5L, 5L, 5L, 5L, 5L, 
5L, 4L, 5L, 5L, 5L, 7L, 5L, 5L), .Label = c(" -7900", " -12200", 
"  0", " 0", " NA", " 200", " 500"), class = "factor")), .Names = c("SAMPLE", 
"ID", "REFERENCE_YEAR", "VALUE1", "VALUE1_CUM"), row.names = c(NA, 
-30L), class = "data.frame") 

Код

library(data.table) 
as.data.table(df)[, .SD[!(VALUE1[1] == 0 & (all(is.na(VALUE1[-1]))))], by = SAMPLE] 

Результаты

# SAMPLE ID REFERENCE_YEAR VALUE1 VALUE1_CUM 
# 1: SAMPLE1 112   1956  0   0 
# 2: SAMPLE1 112   1957 200  200 
# 3: SAMPLE1 112   1958  NA   NA 
# 4: SAMPLE1 112   1959  NA   NA 
# 5: SAMPLE1 112   1960  NA   NA 
# 6: SAMPLE1 112   1963  NA   NA 
# 7: SAMPLE2 137   1878  0   0 
# 8: SAMPLE2 137   1879 -7900  -7900 
# 9: SAMPLE2 137   1880  NA   NA 
#10: SAMPLE2 137   1881  NA   NA 
#11: SAMPLE2 137   1882  NA   NA 
#12: SAMPLE2 137   1890  NA   NA 
#13: SAMPLE2 137   1891  NA   NA 
#14: SAMPLE2 137   1892 -4300  -12200 
#15: SAMPLE2 137   1893  NA   NA 
#16: SAMPLE2 137   1894  NA   NA 
#17: SAMPLE4 0   2000  0   0 
#18: SAMPLE4 0   2001  NA   NA 
#19: SAMPLE4 0   2002  NA   NA 
#20: SAMPLE4 0   2003  NA   NA 
#21: SAMPLE4 0   2004 500  500 
#22: SAMPLE4 0   2005  NA   NA 
#23: SAMPLE4 0   2006  NA   NA 
#SAMPLE ID REFERENCE_YEAR VALUE1 VALUE1_CUM 
+0

это хорошо выглядит. но проблема в том, что он говорит при применении, что он не может найти функцию setDT. У меня установлен data.table 1.8.8. – kurdtc

+0

Можете ли вы обновить версию 'data.table', набрав' console.packages ("data.table") 'в консоли? Если нет, замените 'setDT (df)' на 'as.data.table (df)' –

+0

Да, я пробовал (даже удаляя его и переустанавливая, но все же говорит, версия 1.8.8). попробуем ваше другое предложение, спасибо! – kurdtc

0

Вы можете просто подмножество набора данных с множествами методов после наблюдения следующего вывода. Сначала мы найдем позиции 0s в позициях 1: n-1 в векторе, затем проверьте, являются ли 0 позиций + 1 NA. (Я вручную добавил несколько; в заголовке таблицы для чтения целей)

by(data = df, INDICES = df$SAMPLE, 
    FUN = function(x) any(is.na(x$VALUE1[which((x$VALUE1)[1:(length(x$VALUE1)-1)] == 0)+1]))) 

df$SAMPLE: SAMPLE1 
[1] FALSE 
---------------------------------------------------------------------------- 
df$SAMPLE: SAMPLE2 
[1] FALSE 
---------------------------------------------------------------------------- 
df$SAMPLE: SAMPLE3 
[1] TRUE 


x = "SAMPLE;  ID;  REFERENCE_YEAR; VALUE1; VALUE1_CUM 
SAMPLE1; 112; 1956;   0;  0 
SAMPLE1; 112; 1957;   200; 200 
SAMPLE1; 112; 1958;   NA; NA 
SAMPLE1; 112; 1959;   NA; NA 
SAMPLE1; 112; 1960;   NA; NA 
SAMPLE1; 112; 1963;   NA; NA 
SAMPLE2; 137; 1878;   0;  0 
SAMPLE2; 137; 1879;   -7900; -7900 
SAMPLE2; 137; 1880;   NA; NA 
SAMPLE2; 137; 1881;   NA; NA 
SAMPLE2; 137; 1882;   NA; NA 
SAMPLE2; 137; 1890;   NA; NA 
SAMPLE2; 137; 1891;   NA; NA 
SAMPLE2; 137; 1892;   -4300; -12200 
SAMPLE2; 137; 1893;   NA; NA 
SAMPLE2; 137; 1894;   NA; NA 
SAMPLE3; 136; 1971;   0; -500 
SAMPLE3; 136; 1972;   NA; NA 
SAMPLE3; 136; 1973;   NA; NA 
SAMPLE3; 136; 1974;   NA; NA 
SAMPLE3; 136; 1975;   NA; NA 
SAMPLE3; 136; 1976;   NA; NA 
SAMPLE3; 136; 1980;   NA; NA" 

df = read.table(text = x, sep = ";", header = TRUE, colClasses= c("character", rep("numeric", 4))) 

Под редакцией с выходом 4 с образцом данных

df$SAMPLE: SAMPLE1 
[1] FALSE 
----------------------------------------------------------------------------------------------- 
df$SAMPLE: SAMPLE2 
[1] FALSE 
----------------------------------------------------------------------------------------------- 
df$SAMPLE: SAMPLE3 
[1] TRUE 
----------------------------------------------------------------------------------------------- 
df$SAMPLE: SAMPLE4 
[1] TRUE 
+0

это работает для предыдущей версии, но при наличии другого столбца с 0 (как ID в SAMPLE4, он не работает). Я изменил образец файла. – kurdtc

+0

Прекрасно работает для меня. См. Редактирование вывода. Я читал данные точно так же. – Vlo

+0

Я получаю тот же результат, но SAMPLE4 не должен удаляться, потому что он также содержит число между ними!То, что я хотел бы сделать, это то, что когда в начале выборки есть нуль в VALUE1 и VALUE1_CUM, за которым следует NA, а затем остальное для всего столбца, за которым следует NA, что он удаляется только в этих условиях (например, в SAMPLE3), если нет числа между (500 в SAMPLE4). Но большое спасибо за помощь! – kurdtc

0

Вот в dplyr решение, используя dput() поставляется @David

library(dplyr) 
df %>% 
    group_by(SAMPLE) %>% 
    filter(! (VALUE1[[1]] == 0 & all(is.na(VALUE1[-1])))) 

получения

SAMPLE ID REFERENCE_YEAR VALUE1 VALUE1_CUM 
1 SAMPLE1 112   1956  0   0 
2 SAMPLE1 112   1957 200  200 
3 SAMPLE1 112   1958  NA   NA 
4 SAMPLE1 112   1959  NA   NA 
5 SAMPLE1 112   1960  NA   NA 
6 SAMPLE1 112   1963  NA   NA 
7 SAMPLE2 137   1878  0   0 
8 SAMPLE2 137   1879 -7900  -7900 
9 SAMPLE2 137   1880  NA   NA 
10 SAMPLE2 137   1881  NA   NA 
11 SAMPLE2 137   1882  NA   NA 
12 SAMPLE2 137   1890  NA   NA 
13 SAMPLE2 137   1891  NA   NA 
14 SAMPLE2 137   1892 -4300  -12200 
15 SAMPLE2 137   1893  NA   NA 
16 SAMPLE2 137   1894  NA   NA 
17 SAMPLE4 0   2000  0   0 
18 SAMPLE4 0   2001  NA   NA 
19 SAMPLE4 0   2002  NA   NA 
20 SAMPLE4 0   2003  NA   NA 
21 SAMPLE4 0   2004 500  500 
22 SAMPLE4 0   2005  NA   NA 
23 SAMPLE4 0   2006  NA   NA 
Смежные вопросы