2015-04-09 3 views
1

У меня есть data.frame, где я хочу удалить строки, которые имеют последовательные дни. Например, у меня есть следующее data.frame (head), его имя - sell_tv, и я хочу удалить строки с последовательными датами. В этом конкретном случае я хочу удалить строку 5, поскольку строки 5 & 6 имеют последовательные даты.Удалить строки, содержащие последовательные даты

Date Open High Low Close Sell.TV Buy.TV 
1 2015-04-08 2207 2204 2165 2166 4.038113 3.083603 
2 2015-03-16 2214 2215 2172 2198 4.041986 3.087017 
3 2015-03-05 2343 2364 2320 2324 4.023689 3.081034 
4 2015-01-27 2171 2182 2151 2178 4.021998 3.070200 
5 2015-01-23 2234 2244 2222 2230 4.032086 3.061206 
6 2015-01-22 2278 2282 2242 2246 4.037248 3.095450 

Я написал следующий код для этого, но получаю:

****"Error in if (sell_tv$Date[i] == sell_tv$Date[i + 1] + 1) { : missing value where TRUE/FALSE needed"**** 

Код:

for(i in 1:nrow(sell_tv)) 
{ 
    if (sell_tv$Date[i] == sell_tv$Date[i+1] + 1) 
    { 
    new_sell<- sell_tv[-i,] 
    }  
    else 
    { 
    new_sell<- sell_tv[,] 
    } 
    i= i+1  
} 

Благодарен за любую помощь!

+0

Я вижу несколько проблем в вашем коде. во-первых, вам не нужно увеличивать 'i', потому что' R' сделает это за вас (потому что это так, как хорошо 'R' ;-)). Тогда 'i + 1', когда i является' nrow (sell_tv) ', не будет соответствовать существующей строке. Одним из способов, лежащим в основе вашего кода, может быть создание переменной, в которой вы можете поместить числа строк, которые должны быть удалены, и затем вы можете удалить их сразу – Cath

+0

Нет необходимости в цикле. Это однострочный с логическим индексированием с оператором diff: 'sell_tv [c (9999, diff (sell_tv $ Date))! = -1,]' – smci

ответ

1

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

to_delete <- which(sell_tv$Date[-nrow(sell_tv)]==sell_tv$Date[-1]+1) #5 
new_sell <- sell_tv[-to_delete, ] 

new_sell 
     # Date Open High Low Close Sell.TV Buy.TV 
# 1 2015-04-08 2207 2204 2165 2166 4.038113 3.083603 
# 2 2015-03-16 2214 2215 2172 2198 4.041986 3.087017 
# 3 2015-03-05 2343 2364 2320 2324 4.023689 3.081034 
# 4 2015-01-27 2171 2182 2151 2178 4.021998 3.070200 
# 6 2015-01-22 2278 2282 2242 2246 4.037248 3.095450 

данные

sell_tv <- structure(list(Date = structure(c(16533, 16510, 16499, 16462, 
16458, 16457), class = "Date"), Open = c(2207L, 2214L, 2343L, 
2171L, 2234L, 2278L), High = c(2204L, 2215L, 2364L, 2182L, 2244L, 
2282L), Low = c(2165L, 2172L, 2320L, 2151L, 2222L, 2242L), Close = c(2166L, 
2198L, 2324L, 2178L, 2230L, 2246L), Sell.TV = c(4.038113, 4.041986, 
4.023689, 4.021998, 4.032086, 4.037248), Buy.TV = c(3.083603, 
3.087017, 3.081034, 3.0702, 3.061206, 3.09545)), .Names = c("Date", 
"Open", "High", "Low", "Close", "Sell.TV", "Buy.TV"), row.names = c("1", 
"2", "3", "4", "5", "6"), class = "data.frame") 
0

Это решение может быть использовано для уникальной и дублировать даты в столбце Дата sell_tv кадра данных

sell_tv = read.table("myfile.txt", sep = "\t", header = TRUE, stringsAsFactors = FALSE) 

print(sell_tv) 
#   Date Open High Low Close Sell.TV Buy.TV 
# 1 2015-04-08 2207 2204 2165 2166 4.038113 3.083603 
# 2 2015-03-16 2214 2215 2172 2198 4.041986 3.087017 
# 3 2015-03-05 2343 2364 2320 2324 4.023689 3.081034 
# 4 2015-01-27 2171 2182 2151 2178 4.021998 3.070200 
# 5 2015-01-23 2234 2244 2222 2230 4.032086 3.061206 
# 6 2015-01-22 2278 2282 2242 2246 4.037248 3.095450 

#add duplicate date 
sell_tv[3,1] = "2015-01-23" 

print(sell_tv) 
# Date Open High Low Close Sell.TV Buy.TV 
# 1 2015-04-08 2207 2204 2165 2166 4.038113 3.083603 
# 2 2015-03-16 2214 2215 2172 2198 4.041986 3.087017 
# 3 2015-01-23 2343 2364 2320 2324 4.023689 3.081034 
# 4 2015-01-27 2171 2182 2151 2178 4.021998 3.070200 
# 5 2015-01-23 2234 2244 2222 2230 4.032086 3.061206 
# 6 2015-01-22 2278 2282 2242 2246 4.037248 3.095450 

date_str = sell_tv$Date 

to_delete = c() 

for(i in date_str){ 
    a1 = which(unlist(lapply(date_str, function(x) as.numeric(difftime(x, i))))== 1) 
    if(length(a1) > 0){ 
    to_delete = c(to_delete, a1) 
    } else 
     next 
} 

sell_tv = sell_tv[-to_delete,] 

Выход:

print(sell_tv) 
     Date Open High Low Close Sell.TV Buy.TV 
1 2015-04-08 2207 2204 2165 2166 4.038113 3.083603 
2 2015-03-16 2214 2215 2172 2198 4.041986 3.087017 
4 2015-01-27 2171 2182 2151 2178 4.021998 3.070200 
6 2015-01-22 2278 2282 2242 2246 4.037248 3.095450 
0

Использование логико-индексирование с оператором дифф по дате:

sell_tv[ c(9999,diff(sell_tv$Date)) != -1, ] 

где мы только предварять некоторое значение дозорного к выходу из diff(...)

и если вы хотите исключить «день до или после», затем boolean-not the% in% operator:

sell_tv[ ! (c(9999,diff(sell_tv$Date)) %in% c(-1,+1)), ] 
Смежные вопросы