我需要在列中的兩個文本字串之間復制數字,將其“轉置”到第一個文本字串旁邊的列,然后重復該列的其余部分。資料集有數百行。
不需要“對齊”(例如將 NA 用于校正數字的位置),轉置就足夠了。
輸入:
df1 <- structure(list(column1 = c("STOUT", "18", "9341", "4", "0,2005",
"STOUT", "1", "9341", "25", "0,2004", "STIN", "7", "9341", "0,2003",
"OFF", "7", "L(1)", "9342", "0,2005")), class = "data.frame", row.names = c(NA,
-19L))
> print(df)
column1
1 STOUT
2 18
3 9341
4 4
5 0,2005
6 STOUT
7 1
8 9341
9 25
10 0,2004
11 STIN
12 7
13 9341
14 0,2003
15 OFF
16 7
17 L(1)
18 9342
19 0,2005
所需的輸出:
df2 <- structure(list(column1 = c("STOUT", "STOUT", "STIN", "OFF", "L(1)"
), column2 = c(18L, 1L, 7L, 7L, NA), column3 = c(9341L, 9341L,
9341L, NA, 9342L), column4 = c(4L, 25L, NA, NA, NA), column5 = c(0.2005,
0.2004, 0.2003, NA, 0.2005)), class = "data.frame", row.names = c(NA,
-5L))
> print(df2)
column1 column2 column3 column4 column5
1 STOUT 18 9341 4 0.2005
2 STOUT 1 9341 25 0.2004
3 STIN 7 9341 NA 0.2003
4 OFF 7 NA NA NA
5 L(1) NA 9342 NA 0.2005
我正在考慮在 R 中的其他兩個字串之間提取一個字串
但沒有取得太大進展:-/
提前致謝。
uj5u.com熱心網友回復:
在基于正則運算式的邏輯上拆分:
(我根據大寫字母(即)的存在定義了斷點[A-Z];您可能希望根據預期的斷點修改模式df1$column1。)
a <- split(df1$column1, cumsum(grepl('[A-Z]', df1$column1)))
a
$`1`
[1] "STOUT" "18" "9341" "4" "0,2005"
$`2`
[1] "STOUT" "1" "9341" "25" "0,2004"
$`3`
[1] "STIN" "7" "9341" "0,2003"
$`4`
[1] "OFF" "7"
$`5`
[1] "L(1)" "9342" "0,2005"
然后rbind()填寫NA:
(plyr::rbind.fill()需要一個資料框,所以我lapply()用來呼叫as.data.frame()每個串列元素。)
library(plyr)
plyr::rbind.fill(lapply(a,function(y){as.data.frame(t(y),stringsAsFactors=FALSE)}))
V1 V2 V3 V4 V5
1 STOUT 18 9341 4 0,2005
2 STOUT 1 9341 25 0,2004
3 STIN 7 9341 0,2003 <NA>
4 OFF 7 <NA> <NA> <NA>
5 L(1) 9342 0,2005 <NA> <NA>
uj5u.com熱心網友回復:
這是使用read.csv 制作的基本byR選項grepl
df2 <- with(
df1,
read.csv(
text = paste0(
by(column1, cumsum(grepl("^\\D", column1)), toString),
collapse = "\n"
),
header = FALSE
)
)
這使
> df2
V1 V2 V3 V4 V5 V6
1 STOUT 18 9341 4 0 2005
2 STOUT 1 9341 25 0 2004
3 STIN 7 9341 0 2003 NA
4 OFF 7 NA NA NA NA
5 L(1) 9342 0 2005 NA NA
> str(df2)
'data.frame': 5 obs. of 6 variables:
$ V1: chr "STOUT" "STOUT" "STIN" "OFF" ...
$ V2: int 18 1 7 7 9342
$ V3: int 9341 9341 9341 NA 0
$ V4: int 4 25 0 NA 2005
$ V5: int 0 0 2003 NA NA
$ V6: int 2005 2004 NA NA NA
uj5u.com熱心網友回復:
另一種可能的解決方案,基于tidyverse:
library(tidyverse)
df1 %>%
group_by(aux = cumsum(str_detect(column1, "[^\\d|,]"))) %>%
mutate(x = rep(first(column1), n())) %>%
filter(!str_detect(column1, "[^\\d|,]")) %>%
mutate(name = paste0("column", 2:(n() 1))) %>%
ungroup %>%
pivot_wider(c(aux, x), values_from = column1) %>%
select(-aux, column1 = x)
#> # A tibble: 5 × 5
#> column1 column2 column3 column4 column5
#> <chr> <chr> <chr> <chr> <chr>
#> 1 STOUT 18 9341 4 0,2005
#> 2 STOUT 1 9341 25 0,2004
#> 3 STIN 7 9341 0,2003 <NA>
#> 4 OFF 7 <NA> <NA> <NA>
#> 5 L(1) 9342 0,2005 <NA> <NA>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/492599.html
上一篇:如何從Ecxel中“o=”和“&”字符之間的字串中檢索數字?
下一篇:為什么我的函式只適用于左值
