Пометка поля из широкого формата - PullRequest
0 голосов
/ 23 марта 2019

Я работаю с df, который принимает структуру

df = data.frame(customer = c(1,2)
                , destination_1 = c("c", "b")
                , destination_2 = c("a", NA)
                )
+----------+----------------+---------------+
| customer |  destination_1 | destination_2 | 
+----------+----------------+---------------+
| 1        | c              | a             |
+----------+----------------+---------------+
| 2        | b              | NA            | 
+----------+----------------+---------------+

Нет упорядочения пункта назначения на основе строк (или столбцов). Например. мы видим, что для клиента 1 его пункты назначения обозначены как c, a

Я хочу добавить в число df число столбцов (где n = количество уникальных адресатов во всем df) в качестве отмечающих полей для отображения, если каждый клиент был в каждом пункте назначения. т.е.

df$destination_a <- c(1,0)
df$destination_b <- c(0,1)
df$destination_c <- c(1,0)

+----------+----------------+---------------+---------------+---------------+---------------+
| customer |  destination_1 | destination_2 | destination_a | destination_b | destination_c |
+----------+----------------+---------------+---------------+---------------+---------------+
| 1        | c              | a             | 1             | 0             | 1             |
+----------+----------------+---------------+---------------+---------------+---------------+
| 2        | b              | NA            | 0             | 1             | 0             |
+----------+----------------+---------------+---------------+---------------+---------------+

У меня только малейшее представление о том, как этого добиться. Возможно использование приложения в цикле? Я бы предпочел решение с базовым R, если это возможно. Я с нетерпением жду каких-либо идей. Спасибо.

1 Ответ

1 голос
/ 23 марта 2019

Вы можете

# 1) get the number and destination names of required columns by extracting unique values from your dataframe:
df2 <- df[,c(2,3,4,5)]  #subsetting variables containing the destinations (modify column numbers if needed)
all <- c()
for (i in 1:ncol(df2)){for (j in 1:nrow(df2)){all <- c(all, as.character((df2[j,i])))}}
all <- sort(unique(all))

# 2) from these values make column names and columns and fill them with NAs
all_names <- paste("destination_", all, sep="")
df[,all_names] <- NA

# At this point you have the dataframe with required columns, and you can 
# 3) now you can fill these columns with values (0 or 1):

for (j in 1:nrow(df)){
  rowvalues <- c()
  for (k in 1:ncol(df)){rowvalues <- c(rowvalues, as.character((df[j,k])))}

  for (i in 1:length(all)){
    x <- (ncol(df)-length(all))
    if (all[i] %in% rowvalues){val <- 1}
    else {val <- 0}
    df[j, (i+x)] <- val  
  }
}
...