2016-08-11 5 views
0

У меня есть кадр данных с различными типами строк. Я хотел бы дублировать строки внутри себя и сохранять значение NA, а две цифры - NA и две цифры соответственно.R добавить строки в dataframe

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[] <- lapply(dat, sub, pa="^(.)$", re="\\1\\1") 

Где dat был:

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 

Для достижения своей цели, мы можем использовать lapply и ifelse.

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

Для каждого столбца, если числовой символ в записи равен 1, мы дублируем его; в противном случае сохраните его как оригинальное.

Окончательный вывод:

> 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

Мы также можем сделать это с помощью strrep, которые должны быть быстрее, так как написано в 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 

Возможность использования dplyr будет

library(dplyr) 
DF %>% 
    mutate_each(funs(ifelse(nchar(.)==1, strrep(., 2), .))) 
Смежные вопросы