2013-10-13 2 views
0

변수에 문자열을 대체하는 방법은 다음과 같은 작업반복적 R

Treatment$V010 <- as.numeric(substr(Treatment$V010,1,2)) 
Treatment$V020 <- as.numeric(substr(Treatment$V020,1,2)) 
[...] 
Treatment$V1000 <- as.numeric(substr(Treatment$V1000,1,2)) 

나는 $ V1000에 $ V010, $ V020, $ V030 ... 100 개 변수가있어. 그것들은 다른 길이의 숫자입니다. 나는 숫자의 처음 두 자릿수를 "추출"하고 이전 숫자를 두 자릿수의 새 숫자로 바꾸기를 원합니다.

내 데이터 프레임 "치료"에는 여기서 언급하지 않은 80 ​​가지 변수가 있으므로이 함수를 언급 된 100 가지 변수에만 적용하는 것이 내 목표입니다.

어떻게하면됩니까? 나는 그 명령을 100 번 쓸 수 있었지만 더 나은 해결책이 있다고 확신한다.

답변

3

좋아, 해보 죠. 우선 첫째 : 당신이 당신의 dataframe의 특정 열을 얻기 위해 원하는대로, 당신이 그들에 액세스 할 수 이름을 지정해야합니다

cnames = paste0('V',formatC(seq(10,1000,by=10), width = 3, format = "d", flag = "0")) 

다음 (cnamesc('V010','V020', ..., 'V1000')를 포함하는 벡터이다), 우리가 얻을 것이다 자신의 인덱스 :

coli=unlist(sapply(cnames, function (x) which(colnames(Treatment)==x))) 

,369 ( coli은 관련 열의 Treatment의 인덱스를 포함하는 벡터이다)

마지막으로, 우리는이 컬럼을 통해 함수를 적용됩니다

Treatment[coli] = mapply(function (x) as.numeric(substr(x, 1, 2)), Treatment[coli]) 

가 작동합니까?

PS : 누구나 할 수있는 더 좋은/더 간결한 방법이 있다면, 나에게 알려주세요 :)

편집 :

를 이미 열을 사용할 수있는 중간 단계는 유용하지 않다 이름 cnames 즉, 해당 열을 얻을 수

Treatment[cnames] = mapply(function (x) as.numeric(substr(x, 1, 2)), Treatment[cnames]) 

(열 인덱스에 열 이름의 변환을하는 유일한 장점 dataframe에서 일부 누락 된 열이있을 때입니다 - t에 그의 경우, Treatment['non existing column']undefined columns selected과 충돌 함)

+1

광범위한 좋은! 하지만 '치료'에는 이름이 이미 있기 때문에 '대장균'접근 대신 '치료 [cnames]'를 직접 사용할 수 있다고 생각합니다. 그리고 나서'_ply' 작업. –

+0

니스, 고마워. : 나는 대답을 업데이트했다. – Jealie

+0

그것은 매력처럼 작동합니다! 정말 고맙습니다! – Roccer

1

정규 표현식으로 설명 할 수있는 패턴을 기반으로 관련 열을 선택하는 솔루션입니다.

정규식 설명 :
^ : 문자열
V의 시작 : 리터럴 V
\\d{2} : 정확히 2 자리

Treatment <- data.frame(V010 = c(120, 130), x010 = c(120, 130), xV1000 = c(111, 222), V1000 = c(111, 222)) 
Treatment 
# V010 x010 xV1000 V1000 
# 1 120 120 111 111 
# 2 130 130 222 222 

# columns with a name that matches the pattern (logical vector) 
idx <- grepl(x = names(Treatment), pattern = "^V\\d{2}") 

# substr the relevant columns 
Treatment[ , idx] <- sapply(Treatment[ , idx], FUN = function(x){ 
    as.numeric(substr(x, 1, 2)) 
    }) 

Treatment 
# V010 x010 xV1000 V1000 
# 1 12 120 111 11 
# 2 13 130 222 22 
+0

글쎄, OP의 명시된 목표는'치료 $ V010' (및 다음)의 내용을 대신 칼럼의 이름을 대체하는 것이 었습니다 ... – Jealie

+0

Aaah ... 고마워요 @Jealie, 나는 질문을 잘못 읽었습니다 ... 나는 내 대답을 편집합니다. – Henrik