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"