【问题标题】:Replacing row elements in a dataframe based on values from another dataframe [duplicate]根据来自另一个数据帧的值替换数据帧中的行元素[重复]
【发布时间】:2019-03-25 12:48:03
【问题描述】:

我对 R 很陌生,所以我希望有人可以帮助我。我的一个脚本中的输出表是下面的averagetable,显示了三个不同集群中事件Standing 的不同比例:

> print(averagetable)
   Group.1  Standing
1 cluster1  0.5642857
2 cluster2  0.7795848
3 cluster3  0.7922980

请注意,每次我运行脚本时,R 可以为 averagetable$Standing 上的值分配不同的集群名称(cluster1cluster2cluster3)。另一个输出可以是:

> print(averagetable)
   Group.1 Standing
1 cluster1 0.7795848
2 cluster2 0.5642857
3 cluster3 0.7922980

另一方面,我的脚本生成tableresults 数据框。请在下面找到head() 示例:

> head(tableresults)
  ACTIVITY_X ACTIVITY_Y ACTIVITY_Z winning_cluster
1         19         21         28        cluster3
2         20         14         24        cluster3
3         34         35         49        cluster3
4         18          5         19        cluster2
5         23         27         35        cluster3
6         33         20         39        cluster3

我的问题很简单。我想转换tableresults中的数据,根据三个规则更改winning_cluster列中的字符串:

1) 将Standing 写入tableresults$wining_cluster,将其替换为averagetable 中具有最高Standing 值的集群名称。

2) 在tableresults$wining_cluster 中写入Moving/Feeding,将其替换为在averagetable 中具有第二高Standing 值的集群名称。

3) 将Feeding/Moving 写入tableresults$wining_cluster,将其替换为averagetable 中具有第三高Standing 值的集群名称。

换句话说,这是所需的输出:

> head(tableresults_output)
  ACTIVITY_X ACTIVITY_Y ACTIVITY_Z winning_cluster
1         19         21         28        Standing
2         20         14         24        Standing
3         34         35         49        Standing
4         18          5         19        Moving/Feeding
5         23         27         35        Standing
6         33         20         39        Standing

请注意,拥有一个基于值的分层组件非常重要,该组件将根据 averagetable 值分配条件 1) 2) 或 3)。使用以下方法无法解决此问题:

averagetable$classification <- factor(x = as.character(sort(averagetable$Standing)),
                labels = c('Feeding/Moving', 'Moving/Feeding','Standing'))

使用此命令,Standing 将始终链接到 cluster1Moving/Feedingcluster2Feeding/Movingcluster3,并且在重新生成 averagetable 时不一定是这样。

无论如何,感谢您的帮助,我希望我的问题对论坛来说足够有趣。

【问题讨论】:

  • gsubtail 都不适合这样的事情。 ACTIVITY_* 字段在这个问题的上下文中实际上意味着什么吗?当您说“最高价值”时,您指的是哪个价值? averagetable 每个集群中有三个值,tableresults 中每行有三个值,我不知道你的意思。
  • 合并这些data.frame 可能会更好地解决这个问题,尽管我仍然无法理解这个问题。
  • @NelsonGon 我在我原来的帖子中重新提出了这个问题。希望现在情况更清楚了。
  • 你还没有解释 ACTIVITY_* 与任何事情有什么关系。而且您在逻辑中使用了两次“平均表中的最高排名值”
  • 你好。我已经修复了原始帖子中的“平均表中的最高常设值”问题。 ACTIVITY_* 值不重要。感谢您指出这一点。

标签: r gsub tail


【解决方案1】:

这是一个刺:


tableresults <- read.table(header=TRUE, stringsAsFactors=FALSE, text="
  ACTIVITY_X ACTIVITY_Y ACTIVITY_Z winning_cluster
1         19         21         28        cluster3
2         20         14         24        cluster3
3         34         35         49        cluster3
4         18          5         19        cluster2
5         23         27         35        cluster3
6         33         20         39        cluster3")

averagetable <- read.table(header=TRUE, stringsAsFactors=FALSE, text="
   Group.1  Standing
1 cluster1  0.5642857
2 cluster2  0.7795848
3 cluster3  0.7922980")

averagetable$x <- c("Standing", "Moving/Feeding", "Feeding/Moving")[ rank(-averagetable$Standing) ]
merge(tableresults, averagetable[,c(1,3)], by.x="winning_cluster", by.y="Group.1")
#   winning_cluster ACTIVITY_X ACTIVITY_Y ACTIVITY_Z              x
# 1        cluster2         18          5         19 Moving/Feeding
# 2        cluster3         19         21         28       Standing
# 3        cluster3         20         14         24       Standing
# 4        cluster3         34         35         49       Standing
# 5        cluster3         23         27         35       Standing
# 6        cluster3         33         20         39       Standing

【讨论】:

  • 我已经在我的原始帖子中再次澄清了这一点。 averagetable 是来自上一个命令的输出表。这意味着每次我运行我的脚本时,R 可能会为 Standing 值分配不同的 cluster# 名称。因此,我需要一个命令行来查看Standing 列中的值,并根据我的原始帖子中的 1) 2) 和 3) 规则提供classification
  • 如果重新生成averagetable,只需重新计算$x,是不是很简单?
  • 使用以下重新生成的averagetable,请参阅下面的代码输出:&gt; print(averagetable) Group.1 Moving Feeding Standing 1 cluster1 0.04978355 0.1470238 0.7795848 2 cluster2 0.08214286 0.3216518 0.5642857 3 cluster3 0.03750000 0.1462121 0.7922980
  • &gt; averagetable$x &lt;- c("Standing", "Moving/Feeding", "Feeding/Moving")[ order(averagetable$Standing) ] &gt; averagetable Group.1 Moving Feeding Standing x 1 cluster1 0.04978355 0.1470238 0.7795848 Moving/Feeding 2 cluster2 0.08214286 0.3216518 0.5642857 Standing 3 cluster3 0.03750000 0.1462121 0.7922980 Feeding/Moving。在这种情况下,Standing 被分配到averagetable$Standing 的最低值,Feeding/Moving 被分配到最高值等。如果您对每次我重新生成 averagetable 时如何重写此问题有任何想法,请告诉我.
  • 现在可以了。需要以下命令:averagetable$x &lt;- c("Feeding/Moving", "Moving/Feeding", "Standing")[ order(averagetable$Standing) ] averagetable 而不是 averagetable$x &lt;- c("Standing", "Moving/Feeding", "Feeding/Moving")[ order(averagetable$Standing) ] averagetable 感谢您的帮助。
【解决方案2】:

只需在第一个data.frame 中创建您的classification,然后与您的tableresults 合并

averagetable$classification <- factor(x = as.character(sort(averagetable$Standing)),
                            labels = c('Feeding/Moving', 'Moving/Feeding', 'Standing'))

        Group.1     Moving   Feeding  Standing classification
1: cluster1 0.08214286 0.3216518 0.5642857 Feeding/Moving
2: cluster2 0.04978355 0.1470238 0.7795848 Moving/Feeding
3: cluster3 0.03750000 0.1462121 0.7922980       Standing

merge(tableresults, 
      averagetable[, c('Group.1', 'classification')],
      by.x = 'winning_cluster', by.y = 'Group.1', all.x = T)

   winning_cluster ACTIVITY_X ACTIVITY_Y ACTIVITY_Z classification
1:        cluster2         18          5         19 Moving/Feeding
2:        cluster3         19         21         28       Standing
3:        cluster3         20         14         24       Standing
4:        cluster3         34         35         49       Standing
5:        cluster3         23         27         35       Standing
6:        cluster3         33         20         39       Standing

【讨论】:

  • 感谢您的建议。但是,我需要有某种基于averagetable 值的分层组件。我需要转换几个不同的数据框。请参考我的原始帖子,因为我已经编辑了一些功能以使其更易于理解。
  • factor 命令中的sort 执行层次结构。合并两者后,层次结构将基于平均表,因为classification 是在那里创建的
  • 我已经在我的原始帖子中再次澄清了这一点。 averagetable 是来自上一个命令的输出表。这意味着每次我运行我的脚本时,R 可能会为 Standing 值分配不同的 cluster# 名称。因此,我需要一个命令行来查看Standing 列中的值,并根据我的原始帖子中的 1) 2) 和 3) 规则提供classification
  • 这正是我的命令正在做的事情。它按Standing 列对值进行排序。除非您的平均表不是特定于集群的,或者具有三个以上的集群,否则此命令就是您所要求的。如果不是,请更改问题。
  • 平均表不是集群特定的是什么意思?就像我之前提到的那样,您的代码对于一个最终的averagetable 输出非常有效,但是当我重新生成averagetable 并且Standing 的值可能被分类到averagetable$Group1 中的不同集群时就不行了。当使用merge() 函数作为列winning_cluster 变为“所有cluster1”时,我也得到了不想要的输出:
猜你喜欢
  • 1970-01-01
  • 2020-01-24
  • 1970-01-01
  • 1970-01-01
  • 2016-11-17
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多