【问题标题】:R extract value from column and row in dataframeR从数据框中的列和行中提取值
【发布时间】:2019-03-21 08:17:08
【问题描述】:

我有这样的数据框

#dt
#   one two row MAX_row three four
#1: a   1   0   2       yes   yes
#2: a   2   2   2       yes   yes
#3: a   3   0   2       no    yes
#4: b   1   0   5       yes   no
#5: b   2   5   5       no    no
#6: b   3   0   5       no    no

要创建变量 row 和 MAX_row,我生成的代码如下:

dt$row <-ifelse(dt$two == 2,rownames(dt), 0)
dt <- dt %>% group_by(one) %>% mutate(MAX_row=max(row))

我现在要做的是用第三列中的行中的值填写第四列。行号在列 MAX_row 中指示。因此,在第四列中,第一列中带有“a”的行应该是第三列中第 2 行的值,就像我在 dt 中显示的那样。 我认为如下代码可以,但它会产生奇怪的值:

dt$four <- ifelse(dt$one=='a',dt$three[dt$MAX_row],0)

有什么想法吗?

【问题讨论】:

  • 为什么混合data.tabledplyr 语法?最好留在一个框架内。
  • 另外,row也是一个函数,所以你最好用其他名字来调用你的变量

标签: r dataframe data-extraction


【解决方案1】:

如果我理解正确,您可以从三列 onetwothree 开始,我认为 rowMAX_row 是创建的临时变量,直到 four

我们可以在不需要创建这些变量的情况下获得预期的输出。

library(dplyr)

df %>%
  group_by(one) %>%
  mutate(four = three[which.max(two == 2)])

#  one     two three four 
#  <fct> <int> <fct> <fct>
#1  a         1 yes   yes  
#2  a         2 yes   yes  
#3  a         3 no    yes  
#4  b         1 yes   no   
#5  b         2 no    no   
#6  b         3 no    no   

这仍然会提供您预期的输出,而无需创建 rowMAX_row

数据

df <- structure(list(one = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label 
 = c("a", 
"b"), class = "factor"), two = c(1L, 2L, 3L, 1L, 2L, 3L), three = 
structure(c(2L, 
2L, 1L, 2L, 1L, 1L), .Label = c("no", "yes"), class = "factor")), 
row.names = c("1:", 
"2:", "3:", "4:", "5:", "6:"), class = "data.frame")

【讨论】:

    【解决方案2】:

    最好不要混合使用 data.tabledplyr 语法。由于dt 似乎是data.table,这里是data.table 解决方案

    dt[
        , row := ifelse(two == 2, .I, 0)][,
        , MAX_row := max(row), by = one][,
        , four := ifelse(one == "a", three[MAX_row], 0)]
    #   one two row MAX_row three four
    #1:   a   1   0       2   yes  yes
    #2:   a   2   2       2   yes  yes
    #3:   a   3   0       2    no  yes
    #4:   b   1   0       5   yes   no
    #5:   b   2   5       5    no   no
    #6:   b   3   0       5    no   no
    

    或者一步一步避免生成rowMAX_row(Ronak 强调)

    dt[, four := three[which.max(two == 2)], by = one]
    #   one two row MAX_row three four
    #1:   a   1   0       2   yes  yes
    #2:   a   2   2       2   yes  yes
    #3:   a   3   0       2    no  yes
    #4:   b   1   0       5   yes   no
    #5:   b   2   5       5    no   no
    #6:   b   3   0       5    no   no
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多