2015-07-22 3 views
2

Учитывая следующий кадр данных:Изменение имен столбцов и значение

> df 
    A1 A2 A2.1 A2.2 A3 B1 B2 B2.1 B2.2 B3 
[1,] 0 0 0 0 0 0 0 0 0 0 
[2,] 0 0 0 0 0 0 0 0 0 0 

Я ищу, чтобы заменить все «2,1» от имен столбцов в «аа» и заменить все значения из этих столбцов с номером 1. Так что:

 A1 A2 A aa A2.2 A3 B1 B2 B aa B2.2 B3 
[1,] 0 0 1 0 0 0 0 1 0 0 
[2,] 0 0 1 0 0 0 0 1 0 0 

Как я могу это достичь?

Большое спасибо заранее.

ответ

2

Вы можете попробовать это с grep и gsub

x = c(0,3,5) 
y = c(4,1,7) 
z = c(1,2,3) 
df = data.frame(x,y, z) 
names(df) = c("A1","A2.1", "a2.1") 

index <- grep("2.1",colnames(df)) 
df[, index] <- 1 
colnames(df) <- gsub("2.1", "aa", colnames(df)) 

# > df 
# A1 Aaa aaa 
# 1 0 1 1 
# 2 3 1 1 
# 3 5 1 1 
+1

Спасибо! Отлично работает! – David

+3

Неправильные имена столбцов –

0
x = c(0,3,5) 
y = c(4,1,7) 
df = data.frame(x,y) 
names(df) = c("A1","A2.1") 

df 

#A1 A2.1 
#1 0 4 
#2 3 1 
#3 5 7 

df[,(grepl("2\\.1",names(df)))] <- 0 
names(df)[which(grepl("2\\.1",names(df)))] <- "aa" 

print(df) 

    A1 aa 
1 0 0 
2 3 0 
3 5 0 
+1

Я думаю, это не правильный ответ на проблему OP: OP хочет сохранить все столбцы, и значение должно быть заменено на '1', а не' 0'. – Jaap

+1

Это просто рабочий пример. Тривиально использовать 1 вместо 0. Обратите внимание, что в принятом ответе имена столбцов не такие, как требуется OP –

+1

не заметили, что я верну свой нижний предел – Jaap

2

Вы можете попробовать:

library(dplyr) 
df %>% 
    mutate_each(funs(sub(".*.", 1, .)), ends_with("2.1")) %>% 
    setNames(sub("2.1", " aa", names(.))) 

Что дает:

# A1 A2 A aa A2.2 A3 B1 B2 B aa B2.2 B3 
#1 0 0 1 0 0 0 0 1 0 0 
#2 0 0 1 0 0 0 0 1 0 0 

данные

df <- structure(list(A1 = c(0L, 0L), A2 = c(0L, 0L), A2.1 = c(0L, 0L 
), A2.2 = c(0L, 0L), A3 = c(0L, 0L), B1 = c(0L, 0L), B2 = c(0L, 
0L), B2.1 = c(0L, 0L), B2.2 = c(0L, 0L), B3 = c(0L, 0L)), .Names = c("A1", 
"A2", "A2.1", "A2.2", "A3", "B1", "B2", "B2.1", "B2.2", "B3"), 
class = "data.frame", row.names = c(NA, -2L)) 
+0

В соответствии с OP и желаемым выходом только «2.1» следует заменить на «aa», в то время как первая буква переименованного столбца сохраняется, например «A aa», «B aa», и т. д. – RHertel

+0

@RHertel Это не то, что показывает желаемый результат –

+0

Я действительно думаю. Пожалуйста, проверьте еще раз. – RHertel

0

Если есть только когда одна буква в начале, то просто сделать:

names(df)[substring(names(df),2,4) == "2.1"] <- "aa" 
0

Вот еще одно предложение:

the_two_ones <- grepl("2.1", colnames(df)) 
the_letters <- sapply(colnames(df)[the_two_ones], function(x) gsub("2.1", "", x)) 
colnames(df)[the_two_ones] <- c(paste(the_letters, "aa")) 
df[,the_two_ones] <- 1 
#> df 
# A1 A2 A aa A2.2 A3 B1 B2 B aa B2.2 B3 
#1 0 0 1 0 0 0 0 1 0 0 
#2 0 0 1 0 0 0 0 1 0 0 
Смежные вопросы