2015-06-22 2 views
2

У меня есть п на 2 объекта, содержащего имена переменных в 1-й столбец и числовые значения (баллов) во 2-й колонке:Удалить последующие элементы с одной и той же подстроки

data  <- data.frame(matrix(nrow = 20, ncol = 2)) 
data[, 2] <- 1:20 
data[, 1] <- c("example_a_1", "example_a_2", "example_a_3", 
       "example_b_1", "example_c_1", "example_d_1", 
       "example_d_2", "example_d_3", "example_f_1", 
       "example_g_1", "example_g_2", "example_h_1", 
       "example_i_1", "example_l_1", "example_o_1", 
       "example_j_1", "example_m_1", "example_p_1", 
       "example_k_1", "example_n_1") 
data 
      X1 X2 
1 example_a_1 1 
2 example_a_2 2 
3 example_a_3 3 
4 example_b_1 4 
5 example_c_1 5 
6 example_d_1 6 
7 example_d_2 7 
8 example_d_3 8 
9 example_f_1 9 
10 example_g_1 10 
11 example_g_2 11 
12 example_h_1 12 
13 example_i_1 13 
14 example_l_1 14 
15 example_o_1 15 
16 example_j_1 16 
17 example_m_1 17 
18 example_p_1 18 
19 example_k_1 19 
20 example_n_1 20 

Я не хочу этот объект содержат похожие переменные - если имя переменной имеет одинаковые первые 9 символов (в этом примере) как другое, то оно повторяется. В тех случаях я хочу сохранить только одну из названных переменных.

я могу получить список которых имена переменных являются повторами, как это:

rep <- as.data.frame(table(substr(data[,1], 1, 9))) 
rep <- rep[rep[, 2] > 1, ] 
rep 
     Var1 Freq 
1 example_a 3 
4 example_d 3 
6 example_g 2 

и, таким образом, определить их в for петли или другой условной:

for(i in 1:nrow(data)){ 
    if(substr(data[i, 1], 1, 9) %in% rep[,1])){ 
    # What goes here? 
    # or what's another approach? 
    } 
} 

Однако, я не Какую логику я могу использовать для удаления строк с повторяющимися именами?

Конечный объект должен выглядеть следующим образом:

data 
      X1 X2 
1 example_a_1 1 
2 example_b_1 4 
3 example_c_1 5 
4 example_d_1 6 
5 example_f_1 9 
6 example_g_1 10 
7 example_h_1 12 
8 example_i_1 13 
9 example_l_1 14 
10 example_o_1 15 
11 example_j_1 16 
12 example_m_1 17 
13 example_p_1 18 
14 example_k_1 19 
15 example_n_1 20 
+0

'данных [! Дублируется (подстрока (данные $ X1, 1, 9)),]'? –

+2

@Frank done, спасибо –

+0

Я предпочитаю решение @RobertH, используя дубликаты, не стесняйтесь менять принятый ответ. – zx8754

ответ

5

Вы можете использовать duplicated

short <- substr(data[,1], 1, 9) 
i <- duplicated(short) 
data <- data[!i , ] 
2

Использование dplyr:

library(dplyr) 
data <- data %>% 
      group_by(my9=substr(X1,1,9)) %>% 
      filter(row_number(my9)==1) %>% 
      select(-my9) 
+0

Удивительный! Это подходит для меня. –

2

Я хотел бы создать столбец с сокращенным именем и щебнем на этой колонке:

data$short <- substr(data[,1], 1, 9) 
agg <- aggregate(data$X2~data$short, FUN=min) 

Я использовал мин, потому что вы, кажется, заинтересованы в наименьшей оценке для каждого повторяющегося имени

+0

Это тоже хороший подход. +1 Хотя в этом примере оценки были абсолютно произвольными, хотя в моем фактическом использовании я мог сделать это и заменить 'min' на' max'. –

Смежные вопросы