如何在R中转换数据

如何在R中转换数据,r,dplyr,R,Dplyr,我有CSV数据,例如,A+12、A+13、A+14(这些是chr) 当我将这些数据更改为数字时,应该使用什么样的函数 like A+12 -> 12 A+13 -> 13 A+14 -> 14 substr(x,a,b)获取任何带有字符串的x对象,并在其a和b的第个字母位置上“剪切”它们,因此您可以执行substr(“a+12”,3,4)以仅获取“12”,然后将其作为.numeric()转换为数值: Edit1:由于每个字符串的字母数不同,我们需要更改代码

我有CSV数据,例如,
A+12、A+13、A+14
(这些是chr)

当我将这些数据更改为数字时,应该使用什么样的函数

like A+12 -> 12
     A+13 -> 13
     A+14 -> 14
substr(x,a,b)
获取任何带有字符串的
x
对象,并在其
a
b
的第个字母位置上“剪切”它们,因此您可以执行
substr(“a+12”,3,4)
以仅获取
“12”
,然后将其作为.numeric()转换为数值:

Edit1:由于每个字符串的字母数不同,我们需要更改代码。假设您的数据帧被称为
df
,您描述的列是
old

new = numeric() # Create an empty vector
for(i in 1:nrow(df)){
    new[i] = as.numeric(substr(df$old[i], 3, nchar(df$old[i])))}
# Get from the 3rd to the last letter of string

df$new = c(new[1:100], -new[101:200])
OBS:如果您想使此代码更通用,可以执行以下操作:

df$new = c(new[grep("A", df$old)], -new[grep("B", df$old)])
As
grep
返回模式“A”/“B”在df$old中匹配的索引

Edit2:Karthik S展示的漂亮函数可以大大简化代码:

new = readr::parse_number(df$old)

df$new = c(new[1:100], -new[101:200])


您可以使用readr软件包中的parse_编号:

> library(readr)
> dat <- data.frame(col1 = c('A+12','A+13','A+14'), stringsAsFactors = F)
> dat
  col1
1 A+12
2 A+13
3 A+14
> dat$number <- parse_number(dat$col1)
> dat
  col1 number
1 A+12     12
2 A+13     13
3 A+14     14
添加您的场景:

> dat <- data.frame(col1 = c('A+12', 'B+51', 'A+36', 'B+55', 'B+3' ,'A+31'), stringsAsFactors = F)
> dat
  col1
1 A+12
2 B+51
3 A+36
4 B+55
5  B+3
6 A+31
> dat$number <- parse_number(dat$col1)
> dat %>% mutate(number = case_when(substr(col1, 1,1 ) == 'A' ~ number,
+                                   substr(col1, 1,1 ) == 'B' ~ number * -1))
  col1 number
1 A+12     12
2 B+51    -51
3 A+36     36
4 B+55    -55
5  B+3     -3
6 A+31     31
> 
>dat-dat
可乐
1A+12
2 B+51
3 A+36
4 B+55
5 B+3
6 A+31
>dat$number dat%>%变异(当(substr(col1,1,1)='A'~数字,
+substr(col1,1,1)='B'~数字*-1))
col1数
1A+12
2 B+51-51
3A+36
4 B+55-55
5 B+3-3
6 A+31
> 

如果我要生成+12->-12,该怎么办?此外,csv文件中有50多个值。是否有一个可以立即更改的函数?第二条注释:substr接受任何对象,因此您可以将
作为.numeric(substr(df,3,4))
(其中
df
将是您的文件名)。第一条评论:你想在每个元素中加负号吗?如果是,请使用.numeric(substr(df,3,4)),如果不是,请分享您所需的详细信息。PS:不要害怕分享为什么你需要知道如何解决问题的背景(只要你保持客观),通过这样做,我们可以想出更好的解决方案:)所有列中的值都是a+1。。。A+100,B+1。。。B+100。我想把这个专栏改成另一个专栏。所以A+1,…,A+100,B+1…B+100的原始列到新列1,2,3。。。100,-1,-2,-3它显示错误。。错误:分配的数据
c(新[grep(“R”,df$old)],-new[grep(“D”,df$old)])
必须与现有数据兼容。x现有数据有50行。x分配的数据有49行。ℹ 只有大小为1的向量可以循环使用。如果我希望A+12为12,B+12为-12,我该怎么办?你是说后面跟A的所有数字都是正数,后面跟B的所有数字都是负数?你能在这里分享示例数据吗?你的数据只有A+A+12 B+51 A+36 B+55 B+3 A+31这样,所以A+31变为31,B+3变为-3添加了代码,示例数据显示了你的场景,请检查这是否适用于你。如果答案正确,请用代码旁边的勾号标记我的答案。
> library(readr)
> dat <- data.frame(col1 = c('A+12','A+13','A+14'), stringsAsFactors = F)
> dat
  col1
1 A+12
2 A+13
3 A+14
> dat$number <- parse_number(dat$col1)
> dat
  col1 number
1 A+12     12
2 A+13     13
3 A+14     14
> gsub('(.*)(\\d\\d+$)','\\2', dat$col1)
[1] "12" "13" "14"
> 
> dat <- data.frame(col1 = c('A+12', 'B+51', 'A+36', 'B+55', 'B+3' ,'A+31'), stringsAsFactors = F)
> dat
  col1
1 A+12
2 B+51
3 A+36
4 B+55
5  B+3
6 A+31
> dat$number <- parse_number(dat$col1)
> dat %>% mutate(number = case_when(substr(col1, 1,1 ) == 'A' ~ number,
+                                   substr(col1, 1,1 ) == 'B' ~ number * -1))
  col1 number
1 A+12     12
2 B+51    -51
3 A+36     36
4 B+55    -55
5  B+3     -3
6 A+31     31
>