首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何读取逗号分隔的数字字符串并在其上执行各种功能

如何读取逗号分隔的数字字符串并在其上执行各种功能
EN

Stack Overflow用户
提问于 2020-03-04 08:40:18
回答 1查看 52关注 0票数 0

我有一个用数字逗号分隔的字符串的列,例如'0,1,17,200,6,0,1'。我想为字符串中那些数字(或子字符串)的和创建新的列,这些数字(或子字符串)是而不是等于0。

我可以使用这样的方法来计算整字符串的非零数之和。

代码语言:javascript
运行
复制
df$F1 <- sapply(strsplit(df1$a, ","), function(x) length(which(x>0)))
[1] 5

这将输出' 5‘作为上面示例字符串中的子字符串数,这是正确的,因为'0,1,17,200,6,0,1'中的子字符串数确实是5。

然而,挑战是如何能够限制子字符串的数量。例如,如何获得字符串中的前3或6个子字符串的计数?

EN

Stack Overflow用户

回答已采纳

发布于 2020-03-04 12:29:19

您可以使用gsub和backreference将字符串裁剪到所需的长度,然后才算出有多少子字符串大于0:

数据

代码语言:javascript
运行
复制
df1 <- data.frame(a = "0,1,17,200,6,0,1")
df1$a <- as.character(df1$a)

溶液

首先,将字符串裁剪成任意数量的子字符串--在这里,我将其裁剪为三个数字字符(前两个后面跟着一个逗号)--并将结果存储在一个新的向量中:

代码语言:javascript
运行
复制
df1$a_3 <- gsub("^(\\d+,\\d+,\\d+)(.*)", "\\1", df1$a)
df1$a_3
[1] "0,1,17"

现在,将新的向量插入到sapply语句中,以计算有多少子字符串大于0:

代码语言:javascript
运行
复制
sapply(strsplit(df1$a_3, ","), function(x) length(which(x>0)))
[1] 2

要改变子字符串的数量,相应地改变模式中\\d+的重复次数。例如,这适用于6个子字符串:

代码语言:javascript
运行
复制
df1$a_6 <- gsub("^(\\d+,\\d+,\\d+,\\d+,\\d+,\\d+)(.*)", "\\1", df1$a)
sapply(strsplit(df1$a_6, ","), function(x) length(which(x>0)))
[1] 4

编辑以解释新的一组问题:

要计算子字符串的最大值> 0 (在这里为df1$a举例说明),字符串作为一个整体(对于受限字符串,只需相应地使用相关的向量,例如df1$a_3df1$a_6等):首先使用strsplit拆分字符串,然后使用unlist取消结果列表,最后将结果向量从字符转换为数字,将结果存储在向量中,例如,string_a

代码语言:javascript
运行
复制
string_a <- as.numeric(unlist(strsplit(df1$a, ",")))
string_a
[1]   0   1  17 200   6   0   1

在该向量上,您可以执行各种函数,包括最大值的max和值之和的sum

代码语言:javascript
运行
复制
max(string_a)
[1] 200

sum(string_a)
[1] 225

关于等于0的值数,通过设置sapply语句来调整x == 0语句

代码语言:javascript
运行
复制
sapply(strsplit(df1$a, ","), function(x) length(which(x == 0)))
[1] 2

希望这能有所帮助!

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60521978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档