2015-01-24 2 views
-1

Следующий пример: - это (крайняя иллюстрация) моих данных.маркировка дубликатов в новой колонке в R

structure(list(X = structure(c(1L, 3L, 2L, 1L, 3L, 3L, 2L, 1L 
), .Label = c("aaa", "bbb", "burp"), class = "factor")), .Names = "X", row.names = c(NA, 
-8L), class = "data.frame") 

dataExample 
    X 
1 aaa 
2 burp 
3 bbb 
4 aaa 
5 burp 
6 burp 
7 bbb 
8 aaa 

EDIT: на основе содержимого одного столбца (например, «X»), я хотел бы создать новый столбец (например, «желательно»), который говорит мне, для каждого «кода символа» в столбец «X», независимо от того, смотрю ли я на первое, второе или на n-ое вхождение кода. Кроме того, существует один конкретный «код» из «X», который должен быть исключен из этого процесса подсчета и представлен в виде (например, «отрыжка»).

Здесь приведен пример ожидаемого результата

X  desired 
1 aaa  1 
2 burp  burp 
3 bbb  1 
4 aaa  2 
5 burp  burp 
6 burp  burp 
7 bbb  2 
8 aaa  3 

NB: колонка «желаемый» представляет собой ожидаемый результат, он не является частью набора данных.

+4

Это Это? Где остальная часть вопроса? –

+0

Вы уверены, что хотите иметь смешанные классы в желаемом формате? I., какой класс должен быть числом? –

+0

@RichardScriven Вот и все. В наборе данных реального мира у меня есть только тысячи строк и сотни данных. Кадры и 40 уникальных строк в нетривиальном формате, причем один из них остается нетронутым, как указано выше. – Pasqui

ответ

5

Вот некоторые возможные решения:

с базовым R

df$desired <- with(df, ave(as.character(X), X, FUN = function(x) seq_len(length(x)))) 
df[df$X == "burp", "desired"] <- "burp" 

Или с data.table пакетом

library(data.table) 
setDT(df)[, desired := as.character(seq_len(.N)), 
           X][X == "burp", desired := "burp"] 

Или с dplyr пакетом

library(dplyr) 
df%>% 
    group_by(X) %>% 
    mutate(desired = ifelse(X == "burp", "burp", as.character(row_number()))) 

Edit: комментарий Per Op, вот это иллюстрация, что все подходы к работе

df$desiredBase <- with(df, ave(as.character(X), X, FUN = function(x) seq_len(length(x)))) 
df[df$X == "burp", "desiredBase"] <- "burp" 

setDT(df)[, desiredDT := as.character(seq_len(.N)), 
      X][X == "burp", desiredDT := "burp"] 

setDF(df) %>% 
    group_by(X) %>% 
    mutate(desiredplyr = ifelse(X == "burp", "burp", as.character(row_number()))) 

# Source: local data frame [8 x 4] 
# Groups: X 
# 
#  X desiredBase desiredDT desiredplyr 
# 1 aaa   1   1   1 
# 2 burp  burp  burp  burp 
# 3 bbb   1   1   1 
# 4 aaa   2   2   2 
# 5 burp  burp  burp  burp 
# 6 burp  burp  burp  burp 
# 7 bbb   2   2   2 
# 8 aaa   3   3   3 

данных

df <- structure(list(X = structure(c(1L, 3L, 2L, 1L, 3L, 3L, 2L, 1L 
    ), .Label = c("aaa", "bbb", "burp"), class = "factor")), .Names = "X", row.names = c(NA, -8L), class = "data.frame") 
+0

Уважаемый Дэвид, ваши ответы были полезны, однако реализация 'dplyr' не работает с' ifelse', на самом деле 'row_number()' остается без аргумента, генерируя 'Error in rank (x, ties.method = «first»): аргумент «x» отсутствует, без значения по умолчанию ». Итак, на данный момент я сохранил решение 'dplyr', без' ifelse', для создания нового столбца, а затем выполнил подстановку 'df $ required [df $ X == 'burp'] <- 'burp'' , постскриптум Опция 'data.table' также содержит ошибку. – Pasqui

+0

Какая ошибка вы получаете за решение 'data.table'? Кроме того, решение 'dplyr' не работает, потому что вы запускаете его после запуска версии' data.table'. Попробуйте запустить решение 'dplyr' в новом сеансе R * перед тем, как запустить' data.table' решение. –

+0

Я добавил результаты для всех подходов, объединенных * и * вашего набора данных.Кажется, что все работает нормально –

0

На основании вашего ограниченного ввода:

df <- structure(list(X = structure(c(1L, 3L, 2L, 1L, 3L, 3L, 2L, 1L), .Label = c("aaa", "bbb", "burp"), class = "factor"), desired = structure(c(1L,4L, 1L, 2L, 4L, 4L, 2L, 3L), .Label = c("1", "2", "3", "burp"), class = "factor")), .Names = c("X", "desired"), row.names = c(NA, -8L), class = "data.frame") 

desired <- numeric(nrow(df)) 
set <- df$X 
for(k in seq_along(set)){ 
    cur_set <- set[1:k] 
    cur_el <- set[k] 
    tbl <- table(cur_set) 
    desired[k] <- ifelse(cur_el == "burp", "burp", tbl[names(tbl) == cur_el]) 
} 

df$desired_new <- desired 
> df 
    X desired desired_new 
1 aaa  1   1 
2 burp burp  burp 
3 bbb  1   1 
4 aaa  2   2 
5 burp burp  burp 
6 burp burp  burp 
7 bbb  2   2 
8 aaa  3   3 
Смежные вопросы