объединение строк из следующего идентификатора со строками в текущем идентификаторе - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть датафрейм, как показано ниже.Я хочу paste0 каждую пару current, которые находятся в последующем state числе.

df
state   current
  1       A1
  1       B1
  2       A2
  2       A3
  3       B2
  3       C1

Я хочу всю возможную двойную комбинацию столбца current только со следующим state

resultdf:

combinations
A1A2
A1A3
B1A2
B1A3
A2B2
A2C1
A3B2
A3C1

как я могу сделать это в R?

Ответы [ 3 ]

0 голосов
/ 05 декабря 2018

Вот простой способ использования for loop -

result <- NULL
for(r in seq_len(nrow(df)-2)) {
  n <- ifelse(rep(r %% 2 > 0, 2), 2:3, 1:2)
  result <- c(result, paste0(df$current[r], df$current[r+n]))
}

result
[1] "A1A2" "A1A3" "B1A2" "B1A3" "A2B2" "A2C1" "A3B2" "A3C1"

Вот еще один способ использования ?outer() -

result <- NULL
for(r in seq(1, nrow(df)-2, 2)) {
  result <- c(result, 
              c(outer(df$current[r:(r+1)], df$current[(r+2):(r+3)], FUN = paste0))
            )
}

result
[1] "A1A2" "B1A2" "A1A3" "B1A3" "A2B2" "A3B2" "A2C1" "A3C1"

Растущий result подобный вектор - плохая практика, ноне должно иметь значения, если у вас нет большого количества строк.

0 голосов
/ 05 декабря 2018

data.table версия с объединением от state до state + 1:

library(data.table)
setDT(dat)
dat[, statep1 := state + 1]
dat[dat, on="state==statep1", nomatch=0L, paste0(i.current, current)]
#[1] "A1A2" "A1A3" "B1A2" "B1A3" "A2B2" "A2C1" "A3B2" "A3C1"

Аналогичная логика в базе R:

dat$statep1 <- dat$state + 1
with(merge(dat, dat, by.x="state", by.y="statep1"), paste0(current.y, current.x) )
#[1] "A1A2" "B1A2" "A1A3" "B1A3" "A2B2" "A3B2" "A2C1" "A3C1"
0 голосов
/ 05 декабря 2018

Использование базы R

#Create a comma separated string for each `state`
df1 <- aggregate(current~state, df, toString)

#Function to create combination of strings
get_rolling_paste <- function(x, y) {
    df2 <- expand.grid(trimws(strsplit(x, ",")[[1]]), trimws(strsplit(y, ",")[[1]]))
    paste0(df2$Var1, df2$Var2)
}

#apply the function to every row and it's previous row
x <- c(sapply(2:nrow(df1), function(x) 
       get_rolling_paste(df1$current[x-1], df1$current[x])))
x
#[1] "A1A2" "B1A2" "A1A3" "B1A3" "A2B2" "A3B2" "A2C1" "A3C1"

Вы можете преобразовать ее в информационный кадр, если хотите

resultdf <- data.frame(combinations = x)

#  combinations
#1         A1A2
#2         B1A2
#3         A1A3
#4         B1A3
#5         A2B2
#6         A3B2
#7         A2C1
#8         A3C1

FYI, df1 равно

#  state current
#1     1  A1, B1
#2     2  A2, A3
#3     3  B2, C1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...