【问题标题】:Extract a value of a certain row based on a particular value in a column in a dataframe根据数据框中列中的特定值提取某行的值
【发布时间】:2019-09-09 03:06:27
【问题描述】:

我是 R 新手,正在研究语言数据。我想用 dplyr 做的是通过匹配另一列的值来提取某一行的值。

我尝试在 mutute 中使用 which(),但它不起作用。尝试使用索引,但它有其自身的问题(如下所示)。

例如,假设我有:

library(dplyr)

df <- tibble(ID = c(1,1,1,2,2,3,3,3,4,4),
             year = c(2013,2014,2015,2013,2015,2013,2014,2015,2013,2015),
             Income = c(49, 32, 47, 14, 15, 14, 46, 45, 16, 42),
             Sales = c(12, 21, 42, 30, 10, 19, 16, 27, 18, 32))

最后,我想从前一年中扣除某个值。例如,(2014 年收入)-(2013 年收入)。我想做的是以类似的方式使用 dplyr,我在 base R 中调用df$Income[df$year=="2014"]

我不去的原因:

dftemp <- df %>%
  group_by(ID) %>%
  mutate(Income14minus13 = Income[2] - Income[1])

是指数没有考虑到数据中的 2014 年失踪,所以我想确保我提取的是准确的值。

我也试过没有成功:

dftemp <- df %>%
enter code here`group_by(ID) %>%
mutate(Income13 = Income[which(year==2013)],
         Income14 = Income[which(year==2014)],
         Income14minus13 = Income14 - Income13)

最后,我想把它作为一个输出:

> desired_data
# A tibble: 10 x 7
      ID  year Income Sales Income13 Income14 Income15
   <dbl> <dbl>  <dbl> <dbl>    <dbl>    <dbl>    <dbl>
 1     1  2013     49    12       49       32       47
 2     1  2014     32    21       49       32       47
 3     1  2015     47    42       49       32       47
 4     2  2013     14    30       14       NA       15
 5     2  2015     15    10       14       NA       15
 6     3  2013     14    19       14       46       45
 7     3  2014     46    16       14       46       45
 8     3  2015     45    27       16       46       45
 9     4  2013     16    18       16       NA       42
10     4  2015     42    32       16       NA       42

我注意到 case-when() 仅在单行中生成变量,因此不允许按行操作,而我想要的输出却可以。

非常感谢任何帮助!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    也许在这里加入会有所帮助?

    df %>%
      left_join(by = "ID",
                df %>%
                  select(ID, year, Income) %>%
                  mutate(year = paste0("Income", year)) %>%
                  tidyr::spread(year, Income)
      )
    
    # A tibble: 10 x 7
          ID  year Income Sales Income2013 Income2014 Income2015
       <dbl> <dbl>  <dbl> <dbl>      <dbl>      <dbl>      <dbl>
     1     1  2013     49    12         49         32         47
     2     1  2014     32    21         49         32         47
     3     1  2015     47    42         49         32         47
     4     2  2013     14    30         14         NA         15
     5     2  2015     15    10         14         NA         15
     6     3  2013     14    19         14         46         45
     7     3  2014     46    16         14         46         45
     8     3  2015     45    27         14         46         45
     9     4  2013     16    18         16         NA         42
    10     4  2015     42    32         16         NA         42
    

    【讨论】:

      【解决方案2】:

      也许另一种方法是从长到宽重塑数据;缺失的值会自动变成NA(或者你可以用fill指定一个值)。

      例如

      df %>%
          select(-Sales) %>%
          spread(year, Income) %>%
          mutate(Income14minus13 = `2014` - `2013`)
      ## A tibble: 4 x 5
      #     ID `2013` `2014` `2015` Income14minus13
      #  <dbl>  <dbl>  <dbl>  <dbl>           <dbl>
      #1     1     49     32     47             -17
      #2     2     14     NA     15              NA
      #3     3     14     46     45              32
      #4     4     16     NA     42              NA
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-16
        • 2020-07-19
        • 2017-06-26
        • 1970-01-01
        相关资源
        最近更新 更多