如何将值从另一列R传播到特定组内的空白“”
How to spread the values to blank "" within a specific group from another column R
我查了一些类似的问题给出了方法:
使用 na.strings = ("")
> library(zoo)
> na.locf()
将空白 "" 转换为 NA
它不适用于如下所示的分组情况
df <- read.table(header = T,text = 'Int.Index Int.Line Name Index Index.Line Amount
340 1 John 440 1 700
NA 2 John 440 2 100
NA 3 John 400 3 50
450 1 May 500 1 2401
5694 1 Paul 6023 1 1312
NA 2 Paul 6023 2 7244
NA 1 Tom 7889 1 221
NA 2 Tom 7889 2 2114
NA 1 Joe 231 1 1349
3455 1 Ben 3330 1 1353
NA 2 Ben 3330 2 8651')
目标结果
df_result <- read.table(header = T,text = '
Int.Index Int.Line Name Index Index.Line Amount
340 1 John 440 1 700
340 2 John 440 2 100
340 3 John 400 3 50
450 1 May 500 1 2401
5694 1 Paul 6023 1 1312
5694 2 Paul 6023 2 7244
NA 1 Tom 7889 1 221
NA 2 Tom 7889 2 2114
NA 1 Joe 231 1 1349
3455 1 Ben 3330 1 1353
3455 2 Ben 3330 2 8651')
Tom 组和 Joe 组在没有 $Int.Index
的另一个组之间将被错误地传播应该保持为空白 "" 的值。
$Index
代表组,$Index.Line
显示每个组的行。
根据示例,我们可以按 'Name' 分组,然后执行 fill
library(tidyverse)
df %>%
mutate(rn = row_number()) %>%
group_by(Name) %>%
fill(Int.Index) %>%
arrange(rn) %>%
select(-rn)
# A tibble: 11 x 6
# Groups: Name [6]
# Int.Index Int.Line Name Index Index.Line Amount
# <int> <int> <fctr> <int> <int> <int>
# 1 340 1 John 440 1 700
# 2 340 2 John 440 2 100
# 3 340 3 John 400 3 50
# 4 450 1 May 500 1 2401
# 5 5694 1 Paul 6023 1 1312
# 6 5694 2 Paul 6023 2 7244
# 7 NA 1 Tom 7889 1 221
# 8 NA 2 Tom 7889 2 2114
# 9 NA 1 Joe 231 1 1349
#10 3455 1 Ben 3330 1 1353
#11 3455 2 Ben 3330 2 8651
注意:使用 'Index' 作为组会将第三个观察值归类为一个单独的单元,因为它是 400 而不是 440。
我查了一些类似的问题给出了方法:
使用 na.strings = ("")
> library(zoo)
> na.locf()
将空白 "" 转换为 NA
它不适用于如下所示的分组情况
df <- read.table(header = T,text = 'Int.Index Int.Line Name Index Index.Line Amount
340 1 John 440 1 700
NA 2 John 440 2 100
NA 3 John 400 3 50
450 1 May 500 1 2401
5694 1 Paul 6023 1 1312
NA 2 Paul 6023 2 7244
NA 1 Tom 7889 1 221
NA 2 Tom 7889 2 2114
NA 1 Joe 231 1 1349
3455 1 Ben 3330 1 1353
NA 2 Ben 3330 2 8651')
目标结果
df_result <- read.table(header = T,text = '
Int.Index Int.Line Name Index Index.Line Amount
340 1 John 440 1 700
340 2 John 440 2 100
340 3 John 400 3 50
450 1 May 500 1 2401
5694 1 Paul 6023 1 1312
5694 2 Paul 6023 2 7244
NA 1 Tom 7889 1 221
NA 2 Tom 7889 2 2114
NA 1 Joe 231 1 1349
3455 1 Ben 3330 1 1353
3455 2 Ben 3330 2 8651')
Tom 组和 Joe 组在没有 $Int.Index
的另一个组之间将被错误地传播应该保持为空白 "" 的值。
$Index
代表组,$Index.Line
显示每个组的行。
根据示例,我们可以按 'Name' 分组,然后执行 fill
library(tidyverse)
df %>%
mutate(rn = row_number()) %>%
group_by(Name) %>%
fill(Int.Index) %>%
arrange(rn) %>%
select(-rn)
# A tibble: 11 x 6
# Groups: Name [6]
# Int.Index Int.Line Name Index Index.Line Amount
# <int> <int> <fctr> <int> <int> <int>
# 1 340 1 John 440 1 700
# 2 340 2 John 440 2 100
# 3 340 3 John 400 3 50
# 4 450 1 May 500 1 2401
# 5 5694 1 Paul 6023 1 1312
# 6 5694 2 Paul 6023 2 7244
# 7 NA 1 Tom 7889 1 221
# 8 NA 2 Tom 7889 2 2114
# 9 NA 1 Joe 231 1 1349
#10 3455 1 Ben 3330 1 1353
#11 3455 2 Ben 3330 2 8651
注意:使用 'Index' 作为组会将第三个观察值归类为一个单独的单元,因为它是 400 而不是 440。