R 基于df中的另一列从列中提取数据
我有下面的df,没有choice_text列。我想添加新的列“choice_text”,它在“:”之前提取第3列中的值,基于第2列中的数字。因此,如果选项为1,则选项_文本显示15分钟 身份证件 选择 选择权 选择文本 X 1. 15分钟:1,30分钟:2,45分钟:3 Y 2. 15分钟:1,30分钟:2,45分钟:3 Z 3. 15分钟:1,30分钟:2,45分钟:3R 基于df中的另一列从列中提取数据,r,dataframe,R,Dataframe,我有下面的df,没有choice_text列。我想添加新的列“choice_text”,它在“:”之前提取第3列中的值,基于第2列中的数字。因此,如果选项为1,则选项_文本显示15分钟 身份证件 选择 选择权 选择文本 X 1. 15分钟:1,30分钟:2,45分钟:3 Y 2. 15分钟:1,30分钟:2,45分钟:3 Z 3. 15分钟:1,30分钟:2,45分钟:3 我们可以使用str\u extract\u all,它被矢量化以提取数字(\\d+),后跟'min'和:以及'Choice'
我们可以使用
str\u extract\u all
,它被矢量化以提取数字(\\d+
),后跟'min'和:
以及'Choice'列值,方法是将模式粘贴到'Choice'列,然后使用str\u remove
library(dplyr)
library(stringr)
df1 %>%
mutate(Choice_text = str_remove(str_extract(Options,
str_c("\\d+ mins: ", Choice)), ":\\s+\\d+$"))
-输出
# ID Choice Options Choice_text
#1 X 1 15 mins: 1, 30 mins: 2, 45 mins: 3 15 mins
#2 Y 2 15 mins: 1, 30 mins: 2, 45 mins: 3 30 mins
#3 Z 3 15 mins: 1, 30 mins: 2, 45 mins: 3 45 mins
数据
df1我们可以使用str\u extract\u all
来提取数字(\\d+
),后跟“min”和:
以及“Choice”列值,方法是将模式粘贴到“Choice”列,然后使用str\u remove
library(dplyr)
library(stringr)
df1 %>%
mutate(Choice_text = str_remove(str_extract(Options,
str_c("\\d+ mins: ", Choice)), ":\\s+\\d+$"))
-输出
# ID Choice Options Choice_text
#1 X 1 15 mins: 1, 30 mins: 2, 45 mins: 3 15 mins
#2 Y 2 15 mins: 1, 30 mins: 2, 45 mins: 3 30 mins
#3 Z 3 15 mins: 1, 30 mins: 2, 45 mins: 3 45 mins
数据
df1baser:
trimws(gsub(“:*”,“”),
映射层(`[`,strsplit(df$Options,“,”,df$Choice)
))
#[1]“15分钟”“30分钟”“45分钟”
(这已被修复,因此如果选项
的数量大于选项
,它将返回NA
,而不是失败。)
走查:
strsplit
按,
拆分字符串,生成一个嵌套列表(3长,每行1个),每个列表有3个子字符串(在这种情况下,这3个不同于nrow(df)
3)
mappy(.)
部分对选项进行“压缩”;例如,mappy
行相当于:
oBase R:
trimws(gsub(“:*”,“”),
映射层(`[`,strsplit(df$Options,“,”,df$Choice)
))
#[1]“15分钟”“30分钟”“45分钟”
(这已被修复,因此如果选项
的数量大于选项
,它将返回NA
,而不是失败。)
走查:
strsplit
按,
拆分字符串,生成一个嵌套列表(3长,每行1个),每个列表有3个子字符串(在这种情况下,这3个不同于nrow(df)
3)
mappy(.)
部分对选项进行“压缩”;例如,mappy
行相当于:
o请将您的数据发布到命令dput(您的数据帧)的输出
这样我们可以更轻松地访问您的数据。还可以包括您尝试过的任何代码和/或遇到的错误。还可以添加预期的output@LMc,我在这里嵌入的标记表中使用了alistaire的标记,这有点作弊。当然,它需要编辑问题才能进入基于管道的标记表,但这比read.table
在这种情况下。@r2evans太棒了!感谢您花时间分享这一技巧,因为这些降价表经常发布。请将您的数据发布到命令dput(您的数据框)的输出中
这样我们可以更轻松地访问您的数据。还可以包括您尝试过的任何代码和/或遇到的错误。还可以添加预期的output@LMc,我在这里嵌入的标记表中使用了alistaire的标记,这有点作弊。当然,它需要编辑问题才能进入基于管道的标记表,但这比read.table
在这种情况下。@r2evans太棒了!感谢您花时间分享这一技巧,因为这些降价表经常发布。我非常喜欢这个解决方案。我有两个问题希望您能帮我澄清:(1)为什么您使用str_extract\u all
而不是str_extract
?和(2)为什么要将$
和模式输入的结尾添加到str_remove
?@WilliamGram 1)对不起,我可以使用str_extract
,因为它只用于提取一个元素(更新).2).正则表达式中的$
表示字符串的结尾。因此,通过指定它,我们在删除时避免了任何其他后跟数字的空格匹配(如果有的话)。我非常喜欢此解决方案。我有两个问题,希望您能帮我澄清,(1)为什么要使用str\u extract\u all
而不是str\u extract
?@WilliamGram 1)对不起,我本可以使用str\u extract
,因为它只用于提取一个元素(更新).2).正则表达式中的$
表示字符串的结尾。因此,通过指定它,我们可以避免在删除字符串时任何其他后跟数字的空格匹配(如果有)