r - 列值的切换功能

标签 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)

我想创建一个新变量 (ID2),它切换出任何带有指定首字母的名称。否则,我希望 ID2 包含来自 ID 的首字母。我目前不成功的代码的一个例子有望说明:
swfun <- function(x) {
    switch(x,
        'joe.schmoe' = 'JS',
        'teddy.roos' = 'TR',
        'sally.fields' = 'SF',
        as.character(test$ID)
        )
    } ## In other words, I've created a switch function to replace any names   
              ## with requisite initials. I was 'hoping' that the last command   
              ## [as.character(test$ID)] would populate the rest of ID2 with values 
              ## from test$ID.
test$ID2 <- sapply(test$ID, swfun)

而不是得到 test$ID2 <- c('SPW', 'SM', 'DLS', 'SJ', 'JS', 'CEJ', 'TR', 'GVF', 'MJC', 'LH', 'SF') ,

我收到 test$ID2 <- list(NULL, NULL, "TR", NULL, c("SPW", "SM", "DLS", "SJ", "joe.schmoe", "CEJ", "teddy.roos", "GVF", "MJC", "LH", "sally.fields"), "JS", NULL, "SF", NULL, NULL, NULL)
这个问题类似于我之前问过的问题 ( R: ifelse on string ),但是增加了用前一列的值填充列的其余部分的变化。此外,我想使用 switch 来解决这个问题。因为我对该功能还很陌生。

最佳答案

只需将 switch 函数中的最后一行切换为使用 x而不是 test$ID

swfun <- function(x) {
    switch(x,
        'joe.schmoe' = 'JS',
        'teddy.roos' = 'TR',
        'sally.fields' = 'SF',
        as.character(x)
        )
    }

结果
> unname(sapply(ID, swfun))
 [1] "SPW" "SM"  "DLS" "SJ"  "JS"  "CEJ" "TR"  "GVF" "MJC"
[10] "LH"  "SF" 

编辑重新矢量化(弗兰克):如果您发现自己 sapply经常这样做,你可能会考虑
swfun2 <- Vectorize(swfun)
unname(swfun2(ID))
 [1] "SPW" "SM"  "DLS" "SJ"  "JS"  "CEJ" "TR"  "GVF" "MJC"
[10] "LH"  "SF" 

或以下评论中链接的替代方案。

关于r - 列值的切换功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18950809/

相关文章:

c# - 我在 C# 中声明了一个变量,但不能在 switch 语句中使用它

r - 如何在 DiagrammeR for R 中使用 GraphViz 图

css - Shiny Dashboard 框和表格格式不一致

r - 按 y 轴值对 ggplot 的每个方面的因子进行排序

r - 如何查找包含特定字符串的列名中 `NA`值的个数,并分别显示每列 `NA`值的个数?

PHP5 - OOP - 多态性 - 帮我重写这个简单的开关

r - 如何告诉Anaconda使用系统的RStudio?

go - 我如何在 Go 中以相同的方式对来自多个 channel 的输入使用react?

java - 如何循环这个 switch 语句?

javascript - 如何从 JavaScript 中的 switch 语句调用函数