2016-08-11 3 views
0

다른 종류의 문자열을 가진 데이터 프레임이 있습니다. 문자열 자체를 복제하고 NA 값을 유지하고 두 자리 문자열을 각각 NA와 두 자리로 유지하고 싶습니다.R 데이터 프레임에 문자열 추가

DF: 
    Milk  Cola Juice Coffee Tea Wine 
1 A  NA  A  BD  C A 
2 AB  NA  C  D  CD AD 
3 A  BC  AC  D  D D 
4 AB  B  NA  D  CD AD 
5 B  C  AC  BD  CD NA 
6 AB  BC  C  NA  NA A 
7 NA  BC  A  B  NA A 

Desired output: 
    Milk  Cola Juice Coffee Tea Wine 
1 AA  NA  AA  BD  CC AA 
2 AB  NA  CC  DD  CD AD 
3 AA  BC  AC  DD  DD DD 
4 AB  BB  NA  DD  CD AD 
5 BB  CC  AC  BD  CD NA 
6 AB  BC  CC  NA  NA AA 
7 NA  BC  AA  BB  NA AA 

감사합니다.

답변

4

여기에 정규 표현식 교체 사용하는 시도이다 : 적은 프로그래밍

dat[] <- lapply(dat, function(x) sub("^(.)$", paste(rep("\\1",2),collapse=""), x)) 

또는를하지만 같은 결과 :

dat[] <- lapply(dat, function(x) sub("^(.)$", "\\1\\1", x)) 

아니면 정말 스쿼시 코드려고하는 경우에, 다음 : dat

dat[] <- lapply(dat, sub, pa="^(.)$", re="\\1\\1") 

이었다 장소 :

structure(list(Milk = c("A", "AB", "A", "AB", "B", "AB", NA), 
    Cola = c(NA, NA, "BC", "B", "C", "BC", "BC"), Juice = c("A", 
    "C", "AC", NA, "AC", "C", "A"), Coffee = c("BD", "D", "D", 
    "D", "BD", NA, "B"), Tea = c("C", "CD", "D", "CD", "CD", 
    NA, NA), Wine = c("A", "AD", "D", "AD", NA, "A", "A")), .Names = c("Milk", 
"Cola", "Juice", "Coffee", "Tea", "Wine"), row.names = c("1", 
"2", "3", "4", "5", "6", "7"), class = "data.frame") 
4
DF <- " Milk  Cola Juice Coffee Tea Wine 
1 A  NA  A  BD  C A 
2 AB  NA  C  D  CD AD 
3 A  BC  AC  D  D D 
4 AB  B  NA  D  CD AD 
5 B  C  AC  BD  CD NA 
6 AB  BC  C  NA  NA A 
7 NA  BC  A  B  NA A " 
DF <- read.table(text=DF, stringsAsFactors=FALSE) 

DF입니다 : 당신의 목표를 달성하기

Milk Cola Juice Coffee Tea Wine 
1 A <NA>  A  BD C A 
2 AB <NA>  C  D CD AD 
3 A BC AC  D D D 
4 AB B <NA>  D CD AD 
5 B C AC  BD CD <NA> 
6 AB BC  C <NA> <NA> A 
7 <NA> BC  A  B <NA> A 

, 우리는 lapplyifelse를 사용할 수있다.

DF[] <- lapply(DF, function(x) ifelse(nchar(x) == 1, paste(x, x, sep=""), x)) 

각 열에 대해 항목의 숫자 문자가 1 인 경우 중복됩니다. 그렇지 않으면 원본으로 유지하십시오.

최종 출력 : dplyr를 사용하는 옵션이 될 것

> DF 
    Milk Cola Juice Coffee Tea Wine 
1 AA <NA> AA  BD CC AA 
2 AB <NA> CC  DD CD AD 
3 AA BC AC  DD DD DD 
4 AB BB <NA>  DD CD AD 
5 BB CC AC  BD CD <NA> 
6 AB BC CC <NA> <NA> AA 
7 <NA> BC AA  BB <NA> AA 
2

우리는 또한이 C

DF[] <- lapply(DF, function(x) ifelse(nchar(x)==1, strrep(x,2), x)) 
DF 
# Milk Cola Juice Coffee Tea Wine 
#1 AA <NA> AA  BD CC AA 
#2 AB <NA> CC  DD CD AD 
#3 AA BC AC  DD DD DD 
#4 AB BB <NA>  DD CD AD 
#5 BB CC AC  BD CD <NA> 
#6 AB BC CC <NA> <NA> AA 
#7 <NA> BC AA  BB <NA> AA 

에 기록 된대로 빠르게 처리 될 수있는 strrep를 사용하여이 작업을 수행 할 수 있습니다

library(dplyr) 
DF %>% 
    mutate_each(funs(ifelse(nchar(.)==1, strrep(., 2), .))) 
관련 문제