创建列,以“,”分隔作为数字输出
Create column, separated by "," as a numeric output
我正在尝试将当前行中的数据显示为 "XXX-XX-0001, YY-YY-0001"
到新列中,概述每行中的数字 [2]
我已经设法改变了一个新列,但是它是一个字符输出 chr [2]
,我需要它只是 2。
{r}
bill <- bill %>%
mutate(NO_IA = strsplit(as.character(IA_YES), ","))
当我尝试使用 as .numeric
时,它不喜欢我的输入是“,” - 如果我尝试加倍,它也会拒绝它到 ( as.numeric
& as.character
在同一行)
经过一番澄清后,这里有一个更好的答案:
数据(来自评论)
string <- scan(text = "
AAA-GB-0001
BBB-ES-0005,ADD-GB-0001
BSC-ES-0005,HQQ-GB-0001,REE-GB-0001
BDD-GB-0001,BSC-ES-0005,HQQ-GB-0001,UZZ-DE-0001
BDD-GB-0001,UEE-DE-0001
BDD-GB-0001,BRE-EE-0005,CTT-DE-0002,LZZ-DE-0011,UZZ-DE-0001",
what = character(), sep = "\n")
library(dplyr)
bill <- tibble(IA_YES = string)
下次提供一些示例数据会很有意义。例如,使用 dput()
(在本例中,从 dput(bill)
.
复制结果
解决方案
请注意,代码中的 strsplit
命令会创建一个列表。该列表存储在新创建的列中,可以用作 R
中的任何其他列表。我们可以使用 purrr
包对列表进行操作,它提供了 R
的 *apply 函数的更好版本:
bill %>%
mutate(NO_IA = strsplit(as.character(IA_YES), ",")) %>%
mutate(length = map_int(NO_IA, length))
#> # A tibble: 6 x 3
#> IA_YES NO_IA length
#> <chr> <list> <int>
#> 1 "AAA-GB-0001 " <chr [1~ 1
#> 2 "BBB-ES-0005,ADD-GB-0001 " <chr [2~ 2
#> 3 "BSC-ES-0005,HQQ-GB-0001,REE-GB-0001 " <chr [3~ 3
#> 4 "BDD-GB-0001,BSC-ES-0005,HQQ-GB-0001,UZZ-DE-0001 " <chr [4~ 4
#> 5 "BDD-GB-0001,UEE-DE-0001 " <chr [2~ 2
#> 6 BDD-GB-0001,BRE-EE-0005,CTT-DE-0002,LZZ-DE-0011,UZZ-DE-0~ <chr [5~ 5
map_int(NO_IA, length)
的简短说明:map
函数都以相同的方式工作。您提供一个列表或一个可以转换为列表的向量,并对其应用一个函数。在这种情况下,我们测量列表中每个条目的 length()
。另一种写法是 map_int(NO_IA, function(x) length(x))
。 purrr
与 apply
函数相比的优点是可以更好地控制输出。 map_int
将 return 一个整数,map_chr
,例如 returns 一个字符对象。
旧答案
您可以在转换之前将逗号替换为点:
library(dplyr)df <- tibble(num = c("12,3", "10.7"))
df %>%
mutate(num = as.numeric(sub(",", ".", num, fixed = TRUE)))
#> # A tibble: 2 x 1
#> num
#> <dbl>
#> 1 12.3
#> 2 10.7
更多"tidy"版本:
library(tidyverse)
df <- tibble(num = c("12,3", "10.7"))
df %>%
mutate(num = str_replace(num, fixed(","), ".") %>%
as.numeric())
#> # A tibble: 2 x 1
#> num
#> <dbl>
#> 1 12.3
#> 2 10.7
我正在尝试将当前行中的数据显示为 "XXX-XX-0001, YY-YY-0001"
到新列中,概述每行中的数字 [2]
我已经设法改变了一个新列,但是它是一个字符输出 chr [2]
,我需要它只是 2。
{r}
bill <- bill %>%
mutate(NO_IA = strsplit(as.character(IA_YES), ","))
当我尝试使用 as .numeric
时,它不喜欢我的输入是“,” - 如果我尝试加倍,它也会拒绝它到 ( as.numeric
& as.character
在同一行)
经过一番澄清后,这里有一个更好的答案:
数据(来自评论)
string <- scan(text = "
AAA-GB-0001
BBB-ES-0005,ADD-GB-0001
BSC-ES-0005,HQQ-GB-0001,REE-GB-0001
BDD-GB-0001,BSC-ES-0005,HQQ-GB-0001,UZZ-DE-0001
BDD-GB-0001,UEE-DE-0001
BDD-GB-0001,BRE-EE-0005,CTT-DE-0002,LZZ-DE-0011,UZZ-DE-0001",
what = character(), sep = "\n")
library(dplyr)
bill <- tibble(IA_YES = string)
下次提供一些示例数据会很有意义。例如,使用 dput()
(在本例中,从 dput(bill)
.
解决方案
请注意,代码中的 strsplit
命令会创建一个列表。该列表存储在新创建的列中,可以用作 R
中的任何其他列表。我们可以使用 purrr
包对列表进行操作,它提供了 R
的 *apply 函数的更好版本:
bill %>%
mutate(NO_IA = strsplit(as.character(IA_YES), ",")) %>%
mutate(length = map_int(NO_IA, length))
#> # A tibble: 6 x 3
#> IA_YES NO_IA length
#> <chr> <list> <int>
#> 1 "AAA-GB-0001 " <chr [1~ 1
#> 2 "BBB-ES-0005,ADD-GB-0001 " <chr [2~ 2
#> 3 "BSC-ES-0005,HQQ-GB-0001,REE-GB-0001 " <chr [3~ 3
#> 4 "BDD-GB-0001,BSC-ES-0005,HQQ-GB-0001,UZZ-DE-0001 " <chr [4~ 4
#> 5 "BDD-GB-0001,UEE-DE-0001 " <chr [2~ 2
#> 6 BDD-GB-0001,BRE-EE-0005,CTT-DE-0002,LZZ-DE-0011,UZZ-DE-0~ <chr [5~ 5
map_int(NO_IA, length)
的简短说明:map
函数都以相同的方式工作。您提供一个列表或一个可以转换为列表的向量,并对其应用一个函数。在这种情况下,我们测量列表中每个条目的 length()
。另一种写法是 map_int(NO_IA, function(x) length(x))
。 purrr
与 apply
函数相比的优点是可以更好地控制输出。 map_int
将 return 一个整数,map_chr
,例如 returns 一个字符对象。
旧答案
您可以在转换之前将逗号替换为点:
library(dplyr)df <- tibble(num = c("12,3", "10.7"))
df %>%
mutate(num = as.numeric(sub(",", ".", num, fixed = TRUE)))
#> # A tibble: 2 x 1
#> num
#> <dbl>
#> 1 12.3
#> 2 10.7
更多"tidy"版本:
library(tidyverse)
df <- tibble(num = c("12,3", "10.7"))
df %>%
mutate(num = str_replace(num, fixed(","), ".") %>%
as.numeric())
#> # A tibble: 2 x 1
#> num
#> <dbl>
#> 1 12.3
#> 2 10.7