【问题标题】:Concatenate and count the number of elements in each row?连接并计算每行中的元素数?
【发布时间】:2018-06-20 21:55:36
【问题描述】:
df <- structure(list(ID = c("1", "2", "3", "4", "5", "6"), `ID without mask` = c(NA_character_, 
 NA_character_, NA_character_, NA_character_, NA_character_, NA_character_
), `Other Years` = c("2011", "2015", "2015", "2006, 2006, 2005, 2005, 2007", 
 "2014, 2011", "2007"), `Cut off Year` = c("2011", "2015", "2015", "2005", 
 "2011", "2007"), `2005` = c(NA, NA, NA, "30", "18", NA), `2006` = c(NA_character_, 
 NA_character_, NA_character_, NA_character_, NA_character_, NA_character_
 ), `2007` = c("15", NA, "18", NA, "30, 18", NA), `2008` = c("16", 
 NA, NA, "30, 27", "18, 30", NA), `2009` = c("15", NA, NA, "20", 
 "30, 18", NA), `2010` = c(NA, NA, NA, "30, 20", NA, NA), `2011` = c(NA_character_, 
 NA_character_, NA_character_, NA_character_, NA_character_, NA_character_
 ), `2012` = c(NA, NA, NA, "20, 30", NA, "26"), `2013` = c("15", 
 NA, "19", NA, NA, NA), `2014` = c(NA, NA, "18", NA, NA, NA), 
`2015` = c(NA, NA, "18", NA, "18", NA), `2016` = c(NA_character_, 
 NA_character_, NA_character_, NA_character_, NA_character_, 
 NA_character_)), .Names = c("ID", "ID without mask", 
 "Other Years", "Cut off Year", "2005", "2006", "2007", "2008", 
 "2009", "2010", "2011", "2012", "2013", "2014", "2015", "2016"
 ), row.names = c(NA, 6L), class = "data.frame")

鉴于上述数据框。我希望 R 将连续的每个元素(多年来)连接在一起并计数,然后将其输出到新列中。

基于“截止年份”列,我希望 R 将截止年份之前的元素连接在一个列中,并将截止年份之后的元素连接在第二列中(包括截止年份)。

所以对于截止年份为 2011 的第一行,2007、2008 和 2009 年分别有 15、16、15,所以总共是 3,所以 R 应该在新列中输出数字 3 . 2011 年之后,只有 2013 年的元素有条目,因此“之后”列将只有数字 1。

“30、27”等元素算作二等

这是所需的输出:

structure(list(ID = c("1", "2", "3", "4", "5", "6"), `ID without mask` = c(NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_
), `Other Years` = c("2011", "2015", "2015", "2006, 2006, 2005, 2005, 2007", 
"2014, 2011", "2007"), `Cut off Year` = c("2011", "2015", "2015", "2005", 
"2011", "2007"), `2005` = c(NA, NA, NA, "30", "18", NA), `2006` = c(NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_
), `2007` = c("15", NA, "18", NA, "30, 18", NA), `2008` = c("16", 
NA, NA, "30, 27", "18, 30", NA), `2009` = c("15", NA, NA, "20", 
"30, 18", NA), `2010` = c(NA, NA, NA, "30, 20", NA, NA), `2011` = c(NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_
), `2012` = c(NA, NA, NA, "20, 30", NA, "26"), `2013` = c("15", 
NA, "19", NA, NA, NA), `2014` = c(NA, NA, "18", NA, NA, NA), 
    `2015` = c(NA, NA, "18", NA, "18", NA), `2016` = c(NA_character_, 
    NA_character_, NA_character_, NA_character_, NA_character_, 
    NA_character_), `Before cut` = c("3", "0", "3", "0", "7", "0"), `After cut` = c("1", "0", "1", "8", "1", "1")), .Names = c("ID", "Collab Years Patents", 
"Collab Years Publications", "Cut off Year", "2005", "2006", "2007", "2008", 
"2009", "2010", "2011", "2012", "2013", "2014", "2015", "2016", "Before cut", "After cut"
), row.names = c(NA, 6L), class = "data.frame")

【问题讨论】:

  • 我不明白你所说的“连接”是什么意思。 Before cut 和 After cut 列是有意义的,但所有其他值在您的输入和输出中都是相同的。
  • @Gregor:如果您指的是截止年份列之前的其他列,那么这些列只是为了显示我整个数据框的“维度”。仅考虑年份列和截止列。也许“连接”这个词在这里不合适,但我基本上是想像在输出数据框中一样分别计算前后条目的数量。
  • 好的,我想说其中一些条目可能已经被连接,但没有发生新的连接。

标签: r


【解决方案1】:

我们转换成一个不错的长格式,计算值,然后加入原始格式:

library(tidyr)
library(dplyr)
library(stringr)

gather(df, key = "Year", value = "value", `2005`:`2016`) %>%
    mutate(val_count = str_count(value, pattern = ",") + 1) %>%
    group_by(ID) %>%
    summarize(Before = sum(val_count * (Year < `Cut off Year`), na.rm = TRUE),
              After = sum(val_count * (Year >= `Cut off Year`), na.rm = TRUE)) %>%
    right_join(df) %>%
    select(1:3)
# Joining, by = "ID"
# A tibble: 6 x 3
     ID Before After
  <chr>  <dbl> <dbl>
1     1      3     1
2     2      0     0
3     3      3     1
4     4      0     8
5     5      7     1
6     6      0     1

我使用select(1:3) 仅显示结果的相关部分 - 省略该行以获取所有其他列。为了获得值的数量,我们将逗号的数量加 1。

【讨论】:

  • 感谢您的回答!不幸的是,当我尝试运行 gather 函数时,我收到以下错误:Error in UseMethod("gather_") : no applicable method for 'gather_' applied to an object of class "function"
  • 如果您的工作区中没有名为 df 的数据框,您将收到该错误。由于您在问题中使用了名称df,因此我在答案中使用了它。我通常使用像dd 这样的名称,它会产生更多信息错误,例如“找不到对象'dd'”,但由于df() 是一个内置函数(F 分布的分布函数),你会变得更加混乱而是错误。
  • 你是对的!抱歉,这里有点晚了。执行最后一个代码Joining, by = "ID" 时出现错误。它说:Error: unexpected ',' in "Joining,"。在我的完整数据框中,一些 ID 被跳过,因为我之前删除了一些行,例如它从 ID 285 跳转到 287 等。这可能是错误的原因吗?
  • 不,我只是忘记了一个评论标记。 “Joining by ID”是运行上一行时打印的消息。这不是您需要运行的代码。编辑了答案以修复它。
猜你喜欢
  • 1970-01-01
  • 2019-07-23
  • 2018-08-26
  • 2013-09-26
  • 1970-01-01
  • 2013-10-09
  • 2021-12-12
  • 1970-01-01
  • 2021-01-01
相关资源
最近更新 更多