【问题标题】:Acquire factors for each level of a character vector获取字符向量的每个级别的因子
【发布时间】:2017-10-18 02:50:24
【问题描述】:

给定以下数据集:

Ind <- c(rep("deima1",5), rep("deima2", 5), rep("eryt1", 5), rep("eryt2",5))
Sp <-  c(rep("P. deimaticus",10), rep("P. erythros", 10))

Groups <- data.frame(Ind, Sp)

对于Groups$Ind 的每个级别,我想从Groups$Sp 获取对应的物种并将其存储在因子列表中。结果应该具有相同的长度levels(Groups$Ind)

> result

[1] "P. deimaticus" "P. deimaticus" "P. erythros" "P. erythros"

这个问题在我看来似乎很简单,但是我想不出任何可以解决问题的函数。我尝试了几种不同的循环方式,但似乎缺少一些东西。

【问题讨论】:

  • 我不确定我是否正确理解您的问题,您只是想将 Sp 的级别存储在一个列表中?
  • 不完全。我想要一个问题的答案列表:每个人 (Ind) 属于哪个物种 (Sp)?因此,我最终会得到一个长度相同的列表levels(Groups$Ind),但使用物种名称而不是个体名称

标签: r


【解决方案1】:

这是你想要的吗?

lapply(split(Groups, Groups$Ind), function(x) unique(as.character(x[["Sp"]])))
$deima1
[1] "P. deimaticus"

$deima2
[1] "P. deimaticus"

$eryt1
[1] "P. erythros"

$eryt2
[1] "P. erythros"

或者您可能希望将信息存储在数据框中。

dt <- as.data.frame(table(Groups))
# Subset the data for Freq > 0
subset(dt, Freq > 0)
     Ind            Sp Freq
1 deima1 P. deimaticus    5
2 deima2 P. deimaticus    5
7  eryt1   P. erythros    5
8  eryt2   P. erythros    5

【讨论】:

  • 这绝对是正确的方向!有没有办法可以将这些结果存储为字符向量?
  • @PedroRocha 您可以将lapply 替换为sapply。但是,如果有多个物种名称与一个Ind 关联,您仍然需要使用列表来存储信息。
  • @PedroRocha 请查看我的更新。这可能不是您想要的,但我认为将此类信息存储在数据框中很有用。
  • 表格数据做到了!非常感谢!
【解决方案2】:

您可以使用rep

Ind <- c(rep("deima1",5), rep("deima2", 5), rep("eryt1", 5), rep("eryt2",5))
Sp <-  c(rep("P. deimaticus",10), rep("P. erythros", 10))

Groups <- data.frame(Ind, Sp)

Grp_sp <- levels(Groups$Sp)

rep(Grp_sp, length.out = length(levels(Groups$Ind)) )

【讨论】:

  • 此解决方案仅适用于我提供的示例。我正在寻找一种适用于任何给定数据集的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
相关资源
最近更新 更多