Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R表只有在更改如何使所有值不带for循环时才有值_R_For Loop - Fatal编程技术网

R表只有在更改如何使所有值不带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

数据表由人工读取,因此当值更改以便于读取时,它仅显示前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  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