我想搜索一个变量
首先,我创建一个搜索模式函数:
我将创建一个小数据框,然后将其传递给dplyr的
表格d现在显示为:
接下来,我使用mutate来实现我的函数。目标是读取
这句话的意思是:“输出结果让我只剩下...”
所以,很明显我在一开始写错了什么...或许
谢谢。
也许这与下一步失败有关?因为这个警告在我的示例中没有出现?
placement
的内容,并根据所寻找的模式创建一个新变量 term
。以下是一个最简示例...首先,我创建一个搜索模式函数:
calcterm <- function(x){ # calcterm takes a column argument to read
print(x)
if (x %in% '_fa_') {
return ('fall')
} else if (x %in% '_wi_') {
return('winter')
} else if (x %in% '_sp_') {
return('spring')
} else {return('summer')
}
}
我将创建一个小数据框,然后将其传递给dplyr的
tbl_df
:placement <- c('pn_ds_ms_fa_th_hrs','pn_ds_ms_wi_th_hrs' ,'pn_ds_ms_wi_th_hrs')
hours <- c(1230, NA, 34)
d <- data.frame(placement, hours)
library(dplyr)
d <- tbl_df(d)
表格d现在显示为:
>d
Source: local data frame [3 x 2]
placement hours
(fctr) (dbl)
1 pn_ds_ms_fa_th_hrs 1230
2 pn_ds_ms_wi_th_hrs NA
3 pn_ds_ms_wi_th_hrs 34
接下来,我使用mutate来实现我的函数。目标是读取
placement
的内容,并创建一个新变量,该变量将根据在placement
列中找到的模式而产生fall
、winter
、spring
或summer
的值。d %>% mutate(term=calcterm(placement))
这句话的意思是:“输出结果让我只剩下...”
[1] pn_ds_ms_fa_th_hrs pn_ds_ms_wi_th_hrs pn_ds_ms_wi_th_hrs
Levels: pn_ds_ms_fa_th_hrs pn_ds_ms_wi_th_hrs
Source: local data frame [3 x 3]
placement hours term
(fctr) (dbl) (chr)
1 pn_ds_ms_fa_th_hrs 1230 summer
2 pn_ds_ms_wi_th_hrs NA summer
3 pn_ds_ms_wi_th_hrs 34 summer
Warning messages:
1: In if (x %in% "_fa_") { :
the condition has length > 1 and only the first element will be used
2: In if (x %in% "_wi_") { :
the condition has length > 1 and only the first element will be used
3: In if (x %in% "_sp_") { :
the condition has length > 1 and only the first element will be used
所以,很明显我在一开始写错了什么...或许
%in%
可以用grep模式来代替?我不确定该如何处理。谢谢。
更新
根据下面的回答,我更新了我的完整管道系列,以展示我是如何实现的。我正在处理的数据是“宽”形式的,我首先只是翻转了它的轴,并从其列名中提取有用的信息。这个例子可行——但在我的数据中,在进行mutate()步骤时,我收到以下消息:Error: invalid subscript type 'list'
需要注意的是,在summarise()之后,我会收到警告:
Warning message:
attributes are not identical across measure variables; they will be dropped
也许这与下一步失败有关?因为这个警告在我的示例中没有出现?
set.seed(1)
dfmaker <- function() {
setNames(
data.frame(
replicate(5, sample(c(NA, 300:500), 4, TRUE), FALSE)),
c('pn_ds_ms_fa_th_hrs','rn_ds_ms_wi_th_stu' ,'adn_ds_ms_wi_th_hrs','pn_ds_ms_wi_th_hrs' ,'rn_bsn_ds_ms_wi_th_hrs'))
}
d <- dfmaker()
library(dplyr)
d <- tbl_df(d)
grepl_vec_pattern = Vectorize(grepl, 'pattern')
calcterm = function(s) {
require(pryr)
s = as.character(s)
grepped_patterns = grepl_vec_pattern(s, pattern = c('_sp', '_su', '_fa', '_wi'))
stopifnot(any(rowSums(grepped_patterns) == 1)) # Ensure that there is exactly one match
reduce_to_colname_with_true = apply(grepped_patterns, 1, compose(names, which))
lut_table = c('_sp' = 'spring', '_su' = 'summer', '_fa' = 'fall', '_wi' = 'winter')
lut_table[reduce_to_colname_with_true]
}
select(d, matches("^pn_|^adn_|^bsn_"), -starts_with("rn_bsn")) %>% # all the pn, adn, bsn programs, for all information
select(contains("_hrs") ) %>% # takes out just the hours
gather(placement, hours) %>% # flip it!
group_by(placement) %>% # gather all the schools into a single observation (replicated placement values at this point)
summarise(sumHours = sum(hours, na.rm=T)) %>%
mutate(term = calcterm(placement))
%in%
是用于精确匹配正则表达式的。而mutate
没有任何特殊功能,不能在基础R中完成的操作,因此在此操作中完全不需要使用dplyr
。 - David Arenburgdplyr
中执行操作的问题,回答问题或不回答问题都是可以的。这是dplyr
的完全有效的用法。 - Paul Hiemstradplyr::mutate
(特定的工具)上,因为它并没有什么特别之处,而应该集中精力解决问题本身。 - David Arenburg