根据另一个数据框中的值替换数据框中的行元素
Replacing row elements in a dataframe based on values from another dataframe
我对 R 还很陌生,所以我希望有人能帮助我。我的一个脚本中的输出 table 是下面的 averagetable
,显示三个不同集群中事件 Standing
的不同比例:
> print(averagetable)
Group.1 Standing
1 cluster1 0.5642857
2 cluster2 0.7795848
3 cluster3 0.7922980
请注意,每次我 [=68= 】 纸条。另一个输出可以是:
> 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) 在tableresults$wining_cluster
中写入Standing
,替换为在averagetable
中具有最高Standing
值的集群名称。
2) 在tableresults$wining_cluster
中写入Moving/Feeding
,替换为在averagetable
中具有第二高Standing
值的集群名称。
3) 在tableresults$wining_cluster
中写入Feeding/Moving
,替换为在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
将始终链接到 cluster1
,Moving/Feeding
将始终链接到 cluster2
,Feeding/Moving
将始终链接到 cluster3
,即重新生成 averagetable
时不一定为真。
无论如何,我们将不胜感激,我希望我的问题对论坛来说足够有趣。
只需在第一个 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
这是一个刺:
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
我对 R 还很陌生,所以我希望有人能帮助我。我的一个脚本中的输出 table 是下面的 averagetable
,显示三个不同集群中事件 Standing
的不同比例:
> print(averagetable)
Group.1 Standing
1 cluster1 0.5642857
2 cluster2 0.7795848
3 cluster3 0.7922980
请注意,每次我 [=68= 】 纸条。另一个输出可以是:
> 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) 在tableresults$wining_cluster
中写入Standing
,替换为在averagetable
中具有最高Standing
值的集群名称。
2) 在tableresults$wining_cluster
中写入Moving/Feeding
,替换为在averagetable
中具有第二高Standing
值的集群名称。
3) 在tableresults$wining_cluster
中写入Feeding/Moving
,替换为在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
将始终链接到 cluster1
,Moving/Feeding
将始终链接到 cluster2
,Feeding/Moving
将始终链接到 cluster3
,即重新生成 averagetable
时不一定为真。
无论如何,我们将不胜感激,我希望我的问题对论坛来说足够有趣。
只需在第一个 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
这是一个刺:
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