我有一个首字母变量,名称错误地分散在整个列表中。请参见下面的示例结构:
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
来解决此问题,因为我还不熟悉该功能。
答案 0 :(得分:1)
只需切换切换功能中的最后一行即可使用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"
编辑重新矢量化(Frank):如果您经常发现sapply
这个问题,您可能会考虑
swfun2 <- Vectorize(swfun)
unname(swfun2(ID))
[1] "SPW" "SM" "DLS" "SJ" "JS" "CEJ" "TR" "GVF" "MJC"
[10] "LH" "SF"
或以下评论中链接的备选方案。