R 用于列值的开关函数
我有一个缩写变量,名字错误地散布在列表中。见下面的示例结构:R 用于列值的开关函数,r,switch-statement,R,Switch Statement,我有一个缩写变量,名字错误地散布在列表中。见下面的示例结构: ID <- c('SPW', 'SM', 'DLS', 'SJ', 'joe.schmoe', 'CEJ', 'teddy.roos', 'GVF', 'MJC', 'LH', 'sally.fields') ## Full names shouldn't be there -- only initials. test <- data.frame(ID) ID只需将切换函数中的最后一行切换为使用x而不
ID <- c('SPW', 'SM', 'DLS', 'SJ', 'joe.schmoe', 'CEJ', 'teddy.roos', 'GVF', 'MJC',
'LH', 'sally.fields') ## Full names shouldn't be there -- only initials.
test <- data.frame(ID)
ID只需将切换函数中的最后一行切换为使用x
而不是test$ID
swfun <- function(x) {
switch(x,
'joe.schmoe' = 'JS',
'teddy.roos' = 'TR',
'sally.fields' = 'SF',
as.character(x)
)
}
编辑重新矢量化(Frank):如果你发现自己经常这样做,你可能会考虑
swfun2 <- Vectorize(swfun)
unname(swfun2(ID))
[1] "SPW" "SM" "DLS" "SJ" "JS" "CEJ" "TR" "GVF" "MJC"
[10] "LH" "SF"
swfun2你也可以使用swfun@Frank,我根本不会使用switch
,我只会使用一个命名向量。非常容易。现在我倾向于制作一个带标签的列表或字符向量,获取data.frame(name(x),x)
并将其合并,最后填充一个默认值。@Frank。。。我不明白。那里的优势/效用是什么?对于data.frame,您能做些什么?您不能用x
?@DaNiu我已经在这个答案中编辑了一个回复,但是如果需要,Ricardo可以删除它。可能是重复的
> unname(sapply(ID, swfun))
[1] "SPW" "SM" "DLS" "SJ" "JS" "CEJ" "TR" "GVF" "MJC"
[10] "LH" "SF"
swfun2 <- Vectorize(swfun)
unname(swfun2(ID))
[1] "SPW" "SM" "DLS" "SJ" "JS" "CEJ" "TR" "GVF" "MJC"
[10] "LH" "SF"