R在数据帧中添加字符串

R在数据帧中添加字符串,r,dataframe,R,Dataframe,我有一个不同类型字符串的数据帧。我希望复制字符串本身,并保持NA值和两位数字符串分别保持NA和两位数 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

我有一个不同类型字符串的数据帧。我希望复制字符串本身,并保持NA值和两位数字符串分别保持NA和两位数

 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

谢谢。

这里尝试使用正则表达式替换:

dat[] <- lapply(dat, function(x) sub("^(.)$", paste(rep("\\1",2),collapse=""), x) )
为了实现您的目标,我们可以使用
lappy
ifelse

DF[] <- lapply(DF, function(x) ifelse(nchar(x) == 1, paste(x, x, sep=""), x))
DF[]DF
牛奶可乐汁咖啡茶酒
1 AA AA BD CC AA
2 AB CC DD CD AD
3 AA BC AC DD DD
4 AB BB DD CD AD
5 BB CC AC BD CD
6 AB BC CC AA
公元前7年AA BB AA

我们也可以使用
strep
来实现这一点,因为它是用
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
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")
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)
  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[] <- lapply(DF, function(x) ifelse(nchar(x) == 1, paste(x, x, sep=""), 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
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
library(dplyr)
DF %>%
   mutate_each(funs(ifelse(nchar(.)==1, strrep(., 2), .)))