Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 统一使用字符串中的一位数和两位数_R_String_Data.table_Data Management - Fatal编程技术网

R 统一使用字符串中的一位数和两位数

R 统一使用字符串中的一位数和两位数,r,string,data.table,data-management,R,String,Data.table,Data Management,我有一个非常大的data.table,其中(大量)项由字符串定义,包括文本和数字 library(data.table) dd <- data.table(x = c("A4","A4","A4","A14","A14","A14","B4","B4","B4"),y = c("A4","A14","B4","A4","A14","B4","A4","A14","B4"), z = c(1,2,3,4,5,6,7,8,9)) x y z A4 A4 1 A4 A14

我有一个非常大的data.table,其中(大量)项由字符串定义,包括文本和数字

library(data.table)    
dd <- data.table(x = c("A4","A4","A4","A14","A14","A14","B4","B4","B4"),y = c("A4","A14","B4","A4","A14","B4","A4","A14","B4"), z = c(1,2,3,4,5,6,7,8,9))

x   y   z
A4  A4  1
A4  A14 2
A4  B4  3
A14 A4  4
A14 A14 5
A14 B4  6
B4  A4  7
B4  A14 8
B4  B4  9
但是,我需要以下矩阵计算的原始顺序。有没有什么有效的方法可以将string+一位数重命名为string+两位数(A4->A04)或其他我错过的方法

您可以使用
sprintf()
预先为数字添加0

sprintf("%s%02.0d", "A",  1:20)
# [1] "A01" "A02" "A03" "A04" "A05" "A06" "A07" "A08" "A09" "A10" "A11" "A12" "A13" "A14" "A15" "A16" "A17" "A18" "A19" "A20"

您可以使用将
0
s添加到数据中

dd[nchar(x) == 2, x := paste0(substr(x, 1, 1), 0, substr(x, 2, 2))]
dd[nchar(y) == 2, y := paste0(substr(y, 1, 1), 0, substr(y, 2, 2))]

#      x   y z
# 1: A04 A04 1
# 2: A04 A14 2
# 3: A04 B04 3
# 4: A14 A04 4
# 5: A14 A14 5
# 6: A14 B04 6
# 7: B04 A04 7
# 8: B04 A14 8
# 9: B04 B04 9
或者,如果需要应用于更多列:

to.change <- c('x', 'y')

dd[, (to.change) := lapply(.SD, function(x) ifelse(nchar(x) > 2, x
                                                   , paste0(substr(x, 1, 1), 0, substr(x, 2, 2))))
   , .SDcols = to.change]
to.change 2,x
,粘贴0(substr(x,1,1),0,substr(x,2,2)))
,.SDcols=to.change]

此解决方案中不需要额外的零

# Data frame
df <- data.frame(x = c("A4","A4","A4","A14","A14","A14","B4","B4","B4"),
                 y = c("A4","A14","B4","A4","A14","B4","A4","A14","B4"), 
                 z = c(1,2,3,4,5,6,7,8,9),
                 stringsAsFactors = FALSE)

# Reorder columns and rows using `mixedsort`. 
wide <- dcast(df, x ~ y,value.var   = "z") %>% 
  select(x, mixedsort(unique(df$x))) %>% 
  slice(match(x, mixedsort(unique(df$x))))

另一个可能也是最简单的选择是使用
gtools
-包中的
mixedorder

wide <- dcast(dd, x ~ y, value.var = "z")[gtools::mixedorder(x)]
如果还希望以相同的方式设置列顺序,可以另外使用
setcolorder

setcolorder(wide, c(1, gtools::mixedorder(names(wide)[-1]) + 1))
然后给出:


<>您可能想考虑通过数据直接在数据中实现这一顺序,因此您不必在以后的数据冲突中修复它。 如果已经在某个地方对这些唯一值进行了排序,则不需要
mixedorder
而不需要
mixedorder
,只需将它们转换为因子即可

否则您可以取回订单:

library(gtools)
dd[,1:2] <- lapply(dd[,1:2],function(x) factor(x, mixedsort(unique(x))))

我认为最好使用整数格式,如
“%s%02d”
。无论如何,投票吧。
wide <- dcast(dd, x ~ y, value.var = "z")[gtools::mixedorder(x)]
> wide
     x A14 A4 B4
1:  A4   2  1  3
2: A14   5  4  6
3:  B4   8  7  9
setcolorder(wide, c(1, gtools::mixedorder(names(wide)[-1]) + 1))
> wide
     x A4 A14 B4
1:  A4  1   2  3
2: A14  4   5  6
3:  B4  7   8  9
library(gtools)
dd[,1:2] <- lapply(dd[,1:2],function(x) factor(x, mixedsort(unique(x))))
dcast(dd, x ~ y, value.var = "z")
#      x A4 A14 B4
# 1:  A4  1   2  3
# 2: A14  4   5  6
# 3:  B4  7   8  9