首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据R中其他列的值变化来改变列元素

如何根据R中其他列的值变化来改变列元素
EN

Stack Overflow用户
提问于 2019-01-16 18:42:59
回答 2查看 63关注 0票数 0

我有以下数据:

代码语言:javascript
复制
1   2   1           
2   3   1           
3   4   1           
4   5   1           
5   6   2           
6   7   2           
7   8   2                       
9   10  3           
10  11  3           

..and I希望根据第三列的值更改第二列的元素,以获得以下结果:

代码语言:javascript
复制
1   2   1           
2   3   1           
3   4   1           
4   1   1           
5   6   2           
6   7   2           
7   5   2                       
9   10  3           
10  9   3               

因此,在更改第三列中的值之前,我希望将同一行的第二列元素替换为具有相同第三列值的第一列的第一个元素。

EN

回答 2

Stack Overflow用户

发布于 2019-01-16 18:53:56

这可以使用splitunsplitlapply函数来实现。对于每组V3值,我们将第二列中的最后一个值替换为第一列中的第一个值。split函数接受data.frame并将其转换为数据列表。

代码语言:javascript
复制
unsplit(lapply(split(dat, dat$V3), 
               FUN = function(d) {d[nrow(d), 2] <- d[1,1]; d}))

  V1 V2 V3
1  1  2  1
2  2  3  1
3  3  4  1
4  4  1  1
5  5  6  2
6  6  7  2
7  7  5  2
8  9 10  3
9 10  9  3
票数 0
EN

Stack Overflow用户

发布于 2019-01-17 10:08:36

使用来自rleiddata.table的一个选项。在转换为data.table (setDT(df))后,按'V3‘的游程-id进行分组,将'V2’的最后一个元素与'V1‘的first进行replace,并将其赋值(:=)给'V2’。

代码语言:javascript
复制
library(data.table)
setDT(df)[, V2 := replace(V2, .N, first(V1)), rleid(V3)]
df
#   V1 V2 V3
#1:  1  2  1
#2:  2  3  1
#3:  3  4  1
#4:  4  1  1
#5:  5  6  2
#6:  6  7  2
#7:  7  5  2
#8:  9 10  3
#9: 10  9  3

数据

代码语言:javascript
复制
df <- structure(list(V1 = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 9L, 10L), V2 = c(2L, 
 3L, 4L, 5L, 6L, 7L, 8L, 10L, 11L), V3 = c(1L, 1L, 1L, 1L, 2L, 
   2L, 2L, 3L, 3L)), class = "data.frame", row.names = c(NA, -9L
  ))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54223392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档