2014-06-19 4 views
2

2 개 기능 나는 데이터 프레임 나는 "X"를 원하는 df은 lapply 하나의 명령

> names(df)[17:26] 
[1] "X1." "X2." "X3." "X4." "X5." "X6." "X7." "X8." "X9." "X10." 

에 어떤 이름을 변경하려면 -> "도달"하고 점을 제거합니다. 나는 lapply 사용 :

change <- function(d){ 
    gsub("X","reach",d) 
    gsub("\\.","",d) 
} 
a <- as.character(lapply(names(df)[17:26], change)) 

그러나 "X"변화하지 않았다. 왜?

> a 
[1] "X1" "X2" "X3" "X4" "X5" "X6" "X7" "X8" "X9" "X10" 
+1

첫 번째 작업 결과를 저장하지 않았기 때문입니다. 'd <- gsub ("X", "reach", d)'그리고'gsub ("\\.", "", d)'를해야합니다. –

+1

두 개의'gsub'를 서로 중첩시킬 수도 있습니다 :'gsub ("X", "reach", gsub ("\\.", "", d))'. –

+1

beginneR 제안이 더 좋습니다. 이런 식으로'for' 루프를 버리고 여러분의 솔루션을'a <- gsub ("X", "reach", gsub ("\\.", "", names (df) [17 : 26]))' –

답변

6

당신은 참조 (패턴 식의 괄호에 부분)을 다시 사용하여 단일 gsub에서이 작업을 수행 할 수 있습니다.

x <- names(df)[17:26] 
gsub("X([0-9]+)." , "Reach\\1" , x) 
# [1] "Reach1" "Reach2" "Reach3" "Reach4" "Reach5" "Reach6" "Reach7" "Reach8" "Reach9" "Reach10" 

우리는 [0-9]+를 사용하여 이름 벡터의 숫자와 일치하고 괄호 안에 그들을 둘러싼에 의해 우리는 역 참조로 알려진합니다. 괄호 안의 내용은 역 참조로 참조 할 수 있습니다. 이것이 괄호의 첫 번째 집합이기 때문에 역 참조는 \\1입니다. 또 다른 세트의 중괄호가 있다면 이것을 \\2이라고 부를 수 있습니다. 그래서 우리는 X, 그 다음 어떤 숫자와 .와 일치합니다. 으로 바꾸고 괄호 안에 일치하는 숫자는 \\1을 사용하여 역 참조를 참조하십시오.

이 설명이 의미가 있습니다. 그것은 가장 깨끗한 것이 아닙니다.

+2

참으로 멋진 사람 –