【问题标题】:Formatting of Data Frames in RR中数据帧的格式
【发布时间】:2021-09-28 06:04:11
【问题描述】:

我有一个具有以下结构的data.frame:

我需要的是,如果第一列中的值多次出现,则 V18 列中的所有相应条目都在一个单元格中结束。 我应用了以下代码。

p <- function(v) {
  Reduce(f=paste0, x = v)
}

Data %>% 
    group_by(V1) %>% 
    summarise(test = p(as.character(V18))) %>%
    merge(., M_TEST, by = 'V1') %>%
    select(V1, V18, test)

它给出:

我需要的是 {43,44} 而不是 4344。 我该怎么做?

非常感谢您的帮助!

真诚的

【问题讨论】:

  • 请不要将数据发布为图片。看看如何创建great reproducible example 以了解数据的显示方式。
  • 这样的? Data %&gt;% group_by(V1) %&gt;% summarize(V18 = paste(V18, collapse = ","))
  • 这个其实还不错。谢谢@Jean-Claude Arbaut。这给出了 43,44。我需要的是{43,44}。你知道这是否也有可能吗?
  • 当然。 paste0("{", paste(V18, collapse=","), "}")
  • 你也可以Data %&gt;% group_by(V1) %&gt;% summarize(V18 = list(V18))。这不完全是您想要的,但它将分组元素存储在实际的 R 列表(向量)中。在某些情况下可以派上用场。

标签: r dataframe group-by merge summarize


【解决方案1】:

试试这个:

Data %>% 
  group_by(V1) %>% 
  summarise(test = p(as.character(V18))) %>%
  merge(., M_TEST, by = 'V1') %>%
  select(V1, V18, test) %>% 
  mutate(test = str_remove_all(test, pattern = "NA")) %>% 
  mutate(test = formatC(as.numeric(test), big.mark=",", big.interval = 2L)) %>% 
  mutate(test = paste0("{", test, "}"))

编辑:对于多列,这应该有效:

Data %>% 
  group_by(V1) %>% 
  summarise_at(vars(V2:V18), paste0, collapse="") %>% 
  mutate_at(vars(V2:V18), str_remove_all, pattern = "NA") %>% 
  mutate_at(vars(V2:V18), as.numeric) %>% 
  mutate_at(vars(V2:V18), formatC, big.mark=",", big.interval = 2L)

【讨论】:

  • 谢谢@Mohanasundaram,我认为这非常接近!它不是 {43,44},而是 {4,334}。
  • 对不起。我只是忽略了。添加了 big.interval 参数。立即检查。
  • 你知道这个过程是否也可以同时用于多个列。所以 group_by(V1) 仍然存在,但不仅有 V18,还有从 V2 到 V18 的所有列?
  • 检查编辑。我还对第一个代码进行了一些更改。
  • 谢谢!如果数字的长度不总是 2 而是 1 和 2 的混合,我该怎么办? :(
猜你喜欢
  • 1970-01-01
  • 2017-08-20
  • 2023-02-04
  • 2022-07-28
  • 2013-10-22
  • 2012-10-15
  • 2021-12-01
  • 1970-01-01
  • 2017-06-20
相关资源
最近更新 更多