【问题标题】:Compare all rows to one specific row in r dataframe将所有行与 r 数据框中的一个特定行进行比较
【发布时间】:2018-04-04 17:12:40
【问题描述】:

我想知道如何最有效地将数据框中的所有值与特定条件值进行比较。在这个例子中:

在这个例子中:

id <- c("a","a","b","b")
t <- c(2000,2018,2000,2018)
value <- c(10,20,5,30)
test0 <- data.frame(id,value,t,row.names = paste0(id,"_",t))
test  <- test0

给出:

       id value    t
a_2000  a    10 2000
a_2018  a    20 2018
b_2000  b     5 2000
b_2018  b    30 2018

我想将值与另一个 id、另一个 t 或什至按行名进行比较。

到目前为止,我发现的最佳方法是创建第二个数据框,仅包含 id 的数据,然后加入该列以使用它。

在这种情况下,示例将是:

tmp <- test0 %>%
  subset(id =="a") %>%
  select(value,t) %>%
  rename(ref=value)

test %>%
  left_join(tmp,by="t") %>%
  mutate(vsRef = value/ref)

给出:

  id value    t ref vsRef
1  a    10 2000  10   1.0
2  a    20 2018  20   1.0
3  b     5 2000  10   0.5
4  b    30 2018  20   1.5

我确信一定有一个简单的答案,但不容易找到。你能帮忙吗?

【问题讨论】:

  • 子集然后加入似乎是最简单的答案。

标签: r dplyr


【解决方案1】:

终于找到了一个简单的方法(当我最终决定写这篇文章时!):

test0 %>%
   ddply(.(t),mutate,vsRef=value/value[id=="a"])

  id value    t vsRef
1  a    10 2000   1.0
2  b     5 2000   0.5
3  a    20 2018   1.0
4  b    30 2018   1.5

test0 %>%
   ddply(.(id),mutate,vsRef=value/value[t==2000])

  id value    t vsRef
1  a    10 2000     1
2  a    20 2018     2
3  b     5 2000     1
4  b    30 2018     6

test0 %>%
   mutate(vsRef=value/value[rownames(test0)=="a_2000"])

  id value    t vsRef
1  a    10 2000   1.0
2  a    20 2018   2.0
3  b     5 2000   0.5
4  b    30 2018   3.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多