R 基于df中的另一列从列中提取数据

R 基于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'

我有下面的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'列值,方法是
将模式粘贴到'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).正则表达式中的
      $
      表示字符串的结尾。因此,通过指定它,我们可以避免在删除字符串时任何其他后跟数字的空格匹配(如果有)