如何根据R

时间:2019-01-16 18:43:00

标签: r dataframe

我有以下数据:

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           

..并且我想根据第三列的值更改来更改第二列的元素,以获得以下信息:

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               

因此,在第三列的值更改之前,我想用具有相同第三列值的第一列的第一元素替换同一行的第二列元素。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

这是一个使用rlecumsum来确定第2列中需要更新的元素的索引的解决方案。

# Create data frame
df <- read.table(text = "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    ", header = FALSE)

# Create index
ind <- cumsum(rle(df$V3)$lengths) 

# Update data frame
df[ind, 2] <- df[head(c(1, ind + 1), length(ind)), 1]

# Print result
print(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

reprex package(v0.2.1)于2019-01-16创建

答案 2 :(得分:0)

一个rleid中带有data.table的选项。转换为data.tablesetDT(df))后,按运行长度ID'V3'分组,replace将'V2'的最后一个元素与{ V1”并将其分配({{1)}到'V2'

first

数据

:=