Продолжая цикл со следующей итерации точки разрыва R - PullRequest
0 голосов
/ 05 мая 2018

Возможно, есть простое решение, но я изо всех сил.

У меня есть следующий код:

for(i in 1:nrow(df)){
x[i] <- df[i,]$X4
if(length(unique(df[1:i,]$X4)) == length(unique(df$X4))){
break
}
collect <- data.frame(df[1,]$X1, df[1,]$X2, df[i+1,]$X3)
}

Цикл прерывается после , если достигается условие length(unique(df[1:i,]$X4)) == length(unique(df$X4)). Тем не менее, я хочу снова запустить тот же цикл с i+1 -ой итерации и продолжать проверять, пока не будет выполнено то же самое условие , если условие будет выполнено снова, до конца моего кадра данных.

Мой пример данных выглядит следующим образом:

1       930000  1000000 E2-A
1       1890000 2110000 E2-A
1       2120000 2330000 D
1       2340000 3350000 E2-B
1       3365000 3405000 B
1       5695000 5810000 E2-A
1       6305000 6405000 E2-B
1       6425000 6465000 E1-A
1       6780000 6960000 E2-B
1       7100000 7270000 D
1       7730000 7810000 D 
1       8030000 8380000 E2-A
1       8970000 9170000 E1-A
1       9345000 9555000 E1-B
1       9845000 9930000 E1-A
1       10000000        10100000        E1-B
1       10430000        10560000        E3
1       11720000        11780000        B
1       11900000        11960000        C
1       12185000        12270000        E1-A
1       12450000        12680000        A  #break point of loop because if(length(unique(df[1:i,]$X4)) == length(unique(df$X4)))
1       13990000        14290000        B
1       15250000        15355000        E2-B
1       15475000        15600000        D
1       15655000        15755000        A
1       15920000        16080000        E2-A
1       16120000        16280000        C
1       16400000        16570000        E1-B
1       17280000        17380000        E1-B
1       17450000        17735000        A
1       17760000        17820000        E1-B
1       17825000        17935000        A
1       18925000        19150000        E1-A
1       19220000        19410000        C
1       19680000        19980000        C
1       20230000        20820000        E3 #the if condition is met again after the break, but using break exits the loop
1       20845000        20970000        E2-A
1       21580000        21695000        D
1       21700000        21920000        E2-A
1       22430000        22750000        B
1       22740000        22980000        A
1       23300000        23515000        C
1       23870000        23965000        A
1       24525000        24720000        E2-B
1       25010000        25160000        D
1       25170000        25430000        B
1       25930000        26130000        A
1       26220000        26330000        E2-B
1       26435000        26485000        C

Мой ожидаемый результат:

1       930000        12680000        
1       13990000      20820000

Но то, что я до сих пор получаю, это:

1       930000        12680000        

Как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 08 мая 2018
ulist<- unique(df$X4)
uniq <- length(unique(df$X4))
brk <- 0
rn <- length(df$X1)
coor <- NULL
while (brk < rn) {

found <- rep(0,uniq)
coor.s <- 0
coor.e <- 0

coor.s <- df$X2[brk+1]
for (i in (brk+1):rn) {
for (j in 1:uniq) {
  if(df$X4[i] == ulist[j]) {found[j]<-1}
}
if (sum(found)==uniq) {coor.e <- df$X3[i];brk=i;break}

}

if(sum(found)<uniq) {
break
} else {
collect.df <- as.data.frame(rbind(coor,c(coor.s,coor.e)))
}
}
0 голосов
/ 06 мая 2018
# I saved the data you provided into a file and read them back into R session
df <- read.table("df.txt",quote="#")

# It looks like you are using X1, X2, and so on in your code example
# so I renamed the column names
names(df) <- c("X1","X2","X3","X4")

# check the structure of the data frame
    str(df)
# 'data.frame': 49 obs. of  4 variables:
#   $ X1: int  1 1 1 1 1 1 1 1 1 1 ...
# $ X2: int  930000 1890000 2120000 2340000 3365000 5695000 6305000 6425000 6780000 7100000 ...
# $ X3: int  1000000 2110000 2330000 3350000 3405000 5810000 6405000 6465000 6960000 7270000 ...
# $ X4: Factor w/ 9 levels "A","B","C","D",..: 7 7 4 8 2 7 8 5 8 4 ...

result <- list()
i.new = 1
j = 0
# number of unique values in the 4th column
n.unique <- length(unique(df$X4))
for ( i in seq(nrow(df) )) {

  if(length(unique(df[i.new : i,"X4" ])) == n.unique ){
    j = j+1
    result[[j]] <- c( df[i.new, 2], df[i, 3])
    i.new = i + 1
  }
}

result
# [[1]]
# [1]   930000 12680000
# 
# [[2]]
# [1] 13990000 20820000



# If Dataframe is needed:
do.call(rbind.data.frame, result)
#c.930000L..13990000L. c.12680000L..20820000L.
#1                930000                12680000
#2              13990000                20820000

#If matrix is OK
matrix(unlist(result, use.names=F), ncol = 2, byrow = TRUE)
#         [,1]     [,2]
#[1,]   930000 12680000
#[2,] 13990000 20820000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...