Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.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 如何使用数据帧中特定行的每列中的分隔符拆分每个值_R_Dataframe_Dplyr - Fatal编程技术网

R 如何使用数据帧中特定行的每列中的分隔符拆分每个值

R 如何使用数据帧中特定行的每列中的分隔符拆分每个值,r,dataframe,dplyr,R,Dataframe,Dplyr,我有一个数据框,其中有一些特定的行出错,这意味着两行被合并成一行,用空格表示。我有错误所在行的索引,我希望使用这些索引构建一个函数,简单地创建两个新列表,然后插入到数据帧中(作为两行)并替换不正确的行 我在R中有以下数据帧(第3行是一个错误): 步骤1:所需的输出将是两个列表/向量(对于每个错误行): 步骤2:一旦我有了这些列表,我应该能够将它们作为行插入/添加到现有的数据帧中(并删除错误行),如下所示: 希望在步骤1中获得帮助。除第一列以外的所有列(V1…V4)都有一个空格,可以用作分隔符来分

我有一个数据框,其中有一些特定的行出错,这意味着两行被合并成一行,用空格表示。我有错误所在行的索引,我希望使用这些索引构建一个函数,简单地创建两个新列表,然后插入到数据帧中(作为两行)并替换不正确的行

我在R中有以下数据帧(第3行是一个错误):

步骤1:所需的输出将是两个列表/向量(对于每个错误行):

步骤2:一旦我有了这些列表,我应该能够将它们作为行插入/添加到现有的数据帧中(并删除错误行),如下所示:


希望在步骤1中获得帮助。除第一列以外的所有列(V1…V4)都有一个空格,可以用作分隔符来分割每个值,这使得分割变得很容易,但第一列的位置并没有那么简单。我需要根据我可以匹配的另一个列表为该列手动子集字符串。

我们可以识别有错误的行,这些行中有空格(
\\s
)。创建此类行的单独数据框。获取
位置
并不是一件简单的事,因为其中有很多空白。我使用的逻辑是,最后一个单词进入新行,而之前的所有内容都保持在同一行

最后,我们将这两个数据帧组合起来,得到一个完整的数据帧

library(dplyr)
inds <- grep('\\s', df$V1)

tmp <- df[inds, ]

tmp %>%
  tidyr::separate_rows(everything(), sep = '(\\s)(?!.*\\s)') %>%
  bind_rows(df[-inds, ]) %>%
  type.convert(as.is = TRUE)

#  Location    V1    V2    V3    V4
#  <chr>    <int> <int> <int> <int>
#1 atl m        1     3     1     5
#2 dal          4     4     3     2
#3 nyc          2    20     9     2
#4 bos          4     5     3     8
#5 mia          3     1     8     4
库(dplyr)
印度盾%
绑定行(df[-inds,])%>%
type.convert(as.is=TRUE)
#位置V1 V2 V3 V4
#         
#1 atl m 1 3 1 5
#2 dal 4 3 2
#3纽约市2 20 9 2
#4 bos 4 5 3 8
#5 mia 3 1 8 4

我们可以识别有错误的行,这些行中有空格(
\\s
)。创建此类行的单独数据框。获取
位置
并不是一件简单的事,因为其中有很多空白。我使用的逻辑是,最后一个单词进入新行,而之前的所有内容都保持在同一行

最后,我们将这两个数据帧组合起来,得到一个完整的数据帧

library(dplyr)
inds <- grep('\\s', df$V1)

tmp <- df[inds, ]

tmp %>%
  tidyr::separate_rows(everything(), sep = '(\\s)(?!.*\\s)') %>%
  bind_rows(df[-inds, ]) %>%
  type.convert(as.is = TRUE)

#  Location    V1    V2    V3    V4
#  <chr>    <int> <int> <int> <int>
#1 atl m        1     3     1     5
#2 dal          4     4     3     2
#3 nyc          2    20     9     2
#4 bos          4     5     3     8
#5 mia          3     1     8     4
库(dplyr)
印度盾%
绑定行(df[-inds,])%>%
type.convert(as.is=TRUE)
#位置V1 V2 V3 V4
#         
#1 atl m 1 3 1 5
#2 dal 4 3 2
#3纽约市2 20 9 2
#4 bos 4 5 3 8
#5 mia 3 1 8 4

这有点粗糙,但您只需复制问题行,并将“”拆分的前半部分作为第一行(“atl m”),然后将后半部分作为“dal”行:

tibble(df)%%>%
变异(跨(.fns=~str_replace(,“\\w+$,”))%>%
添加行(
df%>%
切片(3)%>%
突变(跨(.fns=~str_replace(,“^.*(\\w+)$,“\\1”))
)
#一个tibble:5x5
位置V1 V2 V3 V4
1纽约市2 20 9 2
2 bos 4 5 3 8
3 atl m 1 3 1 5
4 mia 3 1 8 4
5.4.4.3.2

这有点粗糙,但您只需复制问题行,并将“”拆分的前半部分作为第一行(“atl m”),然后将后半部分作为“dal”行:

tibble(df)%%>%
变异(跨(.fns=~str_replace(,“\\w+$,”))%>%
添加行(
df%>%
切片(3)%>%
突变(跨(.fns=~str_replace(,“^.*(\\w+)$,“\\1”))
)
#一个tibble:5x5
位置V1 V2 V3 V4
1纽约市2 20 9 2
2 bos 4 5 3 8
3 atl m 1 3 1 5
4 mia 3 1 8 4
5.4.4.3.2

您可以使用
dput(head(df))
添加数据吗?您如何知道出错的行是
atl m
dal
?您如何知道该位置被称为
dal
,它不存在于数据中。@RonakShah。抱歉-我修复了输入数据以反映这一点,并添加了dput()。我知道有错误,因为每个数字列(v1到v4)中都有两个数值,用空格分隔。同样地,我也可以判断,因为“atl m”和“dal”应该是单独的位置。为了给您提供更多的上下文,我使用了一个图像刮板工具将表格从PDF转换为数据帧,但该工具无法正确转换所有行,因此我需要一个解决方法来清理剩余的行。您可以使用
dput(head(df))
添加数据吗?您如何知道出错的行是
atl m
dal
?您如何知道该位置被称为
dal
,它不存在于数据中。@RonakShah。抱歉-我修复了输入数据以反映这一点,并添加了dput()。我知道有错误,因为每个数字列(v1到v4)中都有两个数值,用空格分隔。同样地,我也可以判断,因为“atl m”和“dal”应该是单独的位置。为了给您提供更多的上下文,我使用了一个图像刮板工具将表格从PDF转换为数据帧,但该工具无法正确转换所有行,因此我需要一个解决方法来清理剩余的行。简单且将行分开!有没有办法用这种方法轻松地保持行的顺序?自创建新数据框以来,它将首先按新创建的行排序,然后按原始行排序。如果我能够保持相同的行顺序,那么我可以很容易地覆盖
位置
,因为我有一个列表,列出了该列的正确顺序值。要保持顺序,可以添加一个行号列
df%mutate(row=row_number())
然后使用上面的答案,最后使用
arrange(row)
以排序顺序获取数据,如果没有,则删除
  Location V1 V2 V3 V4
1      nyc  2 20  9  2
2      bos  4  5  3  8
3    atl m  1  3  1  5
4      dal  4  4  3  2
5      mia  3  1  8  4
library(dplyr)
inds <- grep('\\s', df$V1)

tmp <- df[inds, ]

tmp %>%
  tidyr::separate_rows(everything(), sep = '(\\s)(?!.*\\s)') %>%
  bind_rows(df[-inds, ]) %>%
  type.convert(as.is = TRUE)

#  Location    V1    V2    V3    V4
#  <chr>    <int> <int> <int> <int>
#1 atl m        1     3     1     5
#2 dal          4     4     3     2
#3 nyc          2    20     9     2
#4 bos          4     5     3     8
#5 mia          3     1     8     4
tibble(df) %>%
  mutate(across(.fns = ~str_replace(., " \\w+$", ""))) %>%
  add_row(
    df %>% 
      slice(3) %>%
      mutate(across(.fns = ~str_replace(., "^.* (\\w+)$", "\\1")))
  )

# A tibble: 5 x 5
  Location V1    V2    V3    V4   
  <chr>    <chr> <chr> <chr> <chr>
1 nyc      2     20    9     2    
2 bos      4     5     3     8    
3 atl m    1     3     1     5    
4 mia      3     1     8     4    
5 dal      4     4     3     2