根据另一个数据帧中的值替换数据框中的行元素[重复]

问题描述 投票:-2回答:2

这个问题在这里已有答案:

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

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

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

> 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,用Standing中具有最高averagetable值的簇名替换它。

2)在Moving/Feeding中写tableresults$wining_cluster,用Standing中具有第二高averagetable值的簇名替换它。

3)在Feeding/Moving中写tableresults$wining_cluster,用Standing中具有第三高averagetable值的簇名替换它。

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

> 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再生时,这不一定是真的。

无论如何,任何帮助表示赞赏,我希望我的问题足够有趣的论坛。

r gsub tail
2个回答
0
投票

这是一个刺:


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

0
投票

只需在第一个classification创建你的data.frame然后与你的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
© www.soinside.com 2019 - 2024. All rights reserved.