R表只有在更改如何使所有值不带for循环时才有值
数据表由人工读取,因此当值更改以便于读取时,它仅显示前2列中的值 我发现解决这个问题的唯一方法是使用for循环,检查空值并引用前一行中的值 示例表R表只有在更改如何使所有值不带for循环时才有值,r,for-loop,R,For Loop,数据表由人工读取,因此当值更改以便于读取时,它仅显示前2列中的值 我发现解决这个问题的唯一方法是使用for循环,检查空值并引用前一行中的值 示例表 Col.a Col.b Col.c Col.d Col.e Col.f 1 XX XXXX BBBB CCCC DDDD 1 2 Â Â Â Â Â Â 3 YY YYYY BBBB DDDD FFFF 1 4 Â Â CCCC
Col.a Col.b Col.c Col.d Col.e Col.f
1 XX XXXX BBBB CCCC DDDD 1
2 Â Â Â Â Â Â
3 YY YYYY BBBB DDDD FFFF 1
4 Â Â CCCC EEEE GGG 2
5 VV VVVV Â Â Â 3
6 Â Â Â Â Â Â
7 CC CCC CCC1 DDDD DDDD 1
8 Â Â CCC2 EEEE EEEE 1
9 Â Â CCC3 1111 1123 3
10 CC CCC Â Â Â 5
11 Â Â Â Â Â Â
创建dataframe、删除空行/小计行并用列1-2的previous替换值的示例代码
dftest <-
structure(list(Col.a = c("XX", "Â", "YY", "Â", "VV", "Â", "CC",
"Â", "Â", "CC", "Â"), Col.b = c("XXXX", "Â", "YYYY", "Â", "VVVV",
"Â", "CCC", "Â", "Â", "CCC", "Â"), Col.c = c("BBBB", "Â", "BBBB",
"CCCC", "Â", "Â", "CCC1", "CCC2", "CCC3", "Â", "Â"), Col.d = c("CCCC",
"Â", "DDDD", "EEEE", "Â", "Â", "DDDD", "EEEE", "1111", "Â", "Â"
), Col.e = c("DDDD", "Â", "FFFF", "GGG", "Â", "Â", "DDDD", "EEEE",
"1123", "Â", "Â"), Col.f = c("1", "Â", "1", "2", "3", "Â", "1",
"1", "3", "5", "Â")), class = "data.frame", row.names = c(NA,
-11L))
#drop "Â" in col.c as only reason is empty row or subtotal row which is not needed
dftest <- dftest[!dftest$Col.c == "Â",]
for (i in 1:nrow(dftest)) {
if (dftest$Col.a[i] == "Â") {
dftest$Col.a[i] = dftest$Col.a[i-1]
}
if (dftest$Col.b[i] == "Â") {
dftest$Col.b[i] = dftest$Col.b[i-1]
}
}
我们可以在每个列上分别使用
case\u,然后进行筛选
library(dplyr)
dftest %>%
mutate(across(everything(), ~ case_when(. == "Â" ~ lag(.),
TRUE ~ .))) %>%
distinct %>%
filter(across(everything(), ~ . != "Â"))
您可以使用purr
中的accumulate
进行递归计算
library(dplyr)
library(purrr)
dftest %>%
filter(Col.c != 'Â') %>%
mutate(across(c(Col.a, Col.b),
~accumulate(., ~if_else(.y == 'Â', .x, .y)))) -> result
result
# Col.a Col.b Col.c Col.d Col.e Col.f
#1 XX XXXX BBBB CCCC DDDD 1
#2 YY YYYY BBBB DDDD FFFF 1
#3 YY YYYY CCCC EEEE GGG 2
#4 CC CCC CCC1 DDDD DDDD 1
#5 CC CCC CCC2 EEEE EEEE 1
#6 CC CCC CCC3 1111 1123 3
library(dplyr)
library(purrr)
dftest %>%
filter(Col.c != 'Â') %>%
mutate(across(c(Col.a, Col.b),
~accumulate(., ~if_else(.y == 'Â', .x, .y)))) -> result
result
# Col.a Col.b Col.c Col.d Col.e Col.f
#1 XX XXXX BBBB CCCC DDDD 1
#2 YY YYYY BBBB DDDD FFFF 1
#3 YY YYYY CCCC EEEE GGG 2
#4 CC CCC CCC1 DDDD DDDD 1
#5 CC CCC CCC2 EEEE EEEE 1
#6 CC CCC CCC3 1111 1123 3