2011-07-05 3 views
2

제목에서 알 수 있듯이 문자 하나에서 다른 문자로 데이터 프레임의 요소를 변경하려고합니다.R 데이터 프레임의 요소 변경

g1=c("CC","DD","GG") 
g2=c("AA","BB","EE") 
g3=c("HH","II","JJ") 

df=data.frame(g1,g2,g3) 

내가 편지/편지 형식 (A/A에 C/C 또는 AA에 예 CC)에 형식 letterletter에서 요소를 변환하고자하는 나는 "strsplit를 사용하여 알고

다음과 같이 dataframe입니다 "목록에서 작동합니다. 어떻게 든 통합 할 필요가 있다는 것을 알고 있습니다. collapse = "/"

전체 데이터 프레임에 strsplit 함수를 어떻게 적용 할 수 있습니까?

나는의 라인을 따라 뭔가 생각 :

split=function(x) 
{ 
    unlist(paste(strsplit(x,""),collapse="/")) 
} 

j=as.data.frame(apply(df,1,split)) 

을하지만 원하는 결과를 제공하지 않습니다.

업데이트 ---------------- 는 분명히, 다음 스크립트 작동 :보다 효율적인 또는 편리한 방법을있을 경우

split=function(x) 
{ 
    paste(unlist(strsplit(x,"")),collapse="/") 
} 

p=apply(df,c(1,2),split) 

로 주시기 바랍니다 몫.

+0

가 안전하게 사용할 수 있나요'분할 '함수 이름? 이미 기본 패키지 기능이 있습니다. –

답변

6

나는이 접근하는 두 가지 방법으로 생각할 수 있습니다. 하나는 strsplit처럼 사용하고 있습니다. 처음에 있지 않은 빈 문자열과 일치

Split <- function(x) { 
    #unlist(lapply(strsplit(x, ""), paste, collapse="/")) 
    sapply(strsplit(x, ""), paste, collapse="/") 
} 
as.data.frame(lapply(df, Split)) 

는 또 다른 방법은 gsub을 사용하는 것과 \\B 기호 : 당신은 목록의 각 요소를 통해 당신 루프가 strsplit에서 반환 된 부분을 누락했다 또는 "단어"의 끝. 는 "워드"를 구성 무엇

as.data.frame(lapply(df, gsub, pattern="\\B", replacement="/")) 

는, 그래서 여기에 로케일 및 구현에 따라 달라 gsub 및 백 참조를 사용하여 다른 솔루션입니다.

as.data.frame(lapply(df, gsub, pattern="(.)(.)", replacement="\\1/\\2")) 
1

여기에 gsub을 사용하는 해킹이 있습니다. 정규식에 대한 자세한 해야지 아는 사람이 개선 할 수 있도록 : 잘못된 지점에 보내고 unlist을했기 때문에 원래의 솔루션이 작동하지 않는

mySplit <- function(x) 
{ 
    substr(gsub("","/",x),2,4) 
} 

as.data.frame(apply(df,2,mySplit)) 

이유가 있었다. 당신이 unlist 나중에 lapply 일이 예상대로 작동 사용하는 경우 그래서 :

mySplit1 <- function(x) 
{ 
    unlist(lapply(strsplit(x,""),paste,collapse="/")) 
} 

as.data.frame(apply(df,2,mySplit1)) 
+0

방금 ​​테스트 한 결과는 다음과 같습니다. 'g1 = c ("C/C", "D/D", "G/G") g2 = g1 g3 = g1 data.frame , g2, g3) ' – Anon

+0

죄송합니다, 오타! 곧 수정 될 ... – joran

0

paste()를 사용한 또 다른 해킹은 확실히 우아하지는 않지만 작업이 완료됩니다.

for (col in 1:ncol(df)){ 
    df[,col] = paste(substr(df[,col],1,1),"/",substr(df[,col],1,1), sep="") 
} 
2

시작이

insertslash <- function(x) sapply(strsplit(x, ""), function(x) paste(x, collapse="/")) 

같은 함수 정의가 무엇인지는 insertslash(g1)으로해야한다는 것을 자신을 설득와.

이 dataframe의 모든 컬럼에 적용하려면 다음을 수행하십시오

as.data.frame(apply(df, 2, insertslash)) 

를 분명히, 당신은 하나의 불쾌한 한 줄에이를 롤백 할 수 있습니다 :

as.data.frame(apply(df, 2, function(x) sapply(strsplit(x, ""), function(x) paste(x, collapse="/"))))