根据列值中的条件替换行字符串

时间:2019-03-22 15:35:01

标签: r for-loop if-statement

我有多个具有以下格式的数据集

head(averagetable)
   Group.1     Moving   Feeding  Standing
1 cluster1 0.05632530 0.1722892 0.7503012
2 cluster2 0.09220779 0.2644481 0.6118506
3 cluster3 0.04863636 0.1268182 0.7993182

我对R很陌生,但是我的任务很简单:

1)我想用cluster#列中具有最高值的行中的Group.1来替换Standing中的名称Standing

2)名称Moving/Feeding到列Standing的第二高值

3)名称Feeding/Moving到列Standing的第三个最高值。

因此输出:

print(averagetable)
   Group.1       Moving     Feeding   Standing
1 Moving/Feeding 0.05632530 0.1722892 0.7503012
2 Feeding/Moving 0.09220779 0.2644481 0.6118506
3 Standing       0.04863636 0.1268182 0.7993182

希望这很清楚。请注意,使用order()替换字符串不符合我的需求,因为我有多个数据框,并且值可能不同。我猜想ifelse()是要使用的函数,但我猜想需要实现for循环,我不确定该怎么做。

1 个答案:

答案 0 :(得分:1)

您只需order Standing并替换Group.1

averagetables$Group.1[order(averagetables$Standing)] <- 
                      c("Feeding/Moving", "Moving/Feeding", "Standing")

averagetables
#         Group.1     Moving   Feeding  Standing
#1 Moving/Feeding 0.05632530 0.1722892 0.7503012
#2 Feeding/Moving 0.09220779 0.2644481 0.6118506
#3       Standing 0.04863636 0.1268182 0.7993182

如果有很多行,并且您只想更改Group.1的前3个值中的Standing值,则可以使用tail进行子集

inds <- tail(order(averagetables$Standing), 3)
averagetables$Group.1[inds] <- c("Feeding/Moving", "Moving/Feeding", "Standing")

这只会更改Group.1的第一高,第二最高和第三高值在Standing中的值。

数据

averagetables <- structure(list(Group.1 = c("cluster1", "cluster2", 
"cluster3"
), Moving = c(0.0563253, 0.09220779, 0.04863636), Feeding = 
c(0.1722892, 
0.2644481, 0.1268182), Standing = c(0.7503012, 0.6118506, 0.7993182
)), row.names = c("1", "2", "3"), class = "data.frame")