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

How to read a comma-separated numerical string and perform various functions on it

我有一列包含以逗号分隔的数字字符串,例如 '0,1,17,200,6,0,1'。 我想为 not 等于 0.

的字符串中的那些数字(或子字符串)的总和创建新列

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

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 个子字符串的计数?

您可以使用 gsub 和反向引用将字符串剪切到所需的长度 您计算有多少子字符串 > 0:

数据:

df1 <- data.frame(a = "0,1,17,200,6,0,1")
df1$a <- as.character(df1$a)

解决方案:

首先将字符串剪切成您想要的任意数量的子字符串——在这里,我将其剪切成三个数字字符(前两个后跟一个逗号)——并将结果存储在一个新的矢量:

df1$a_3 <- gsub("^(\d+,\d+,\d+)(.*)", "\1", df1$a)
df1$a_3
[1] "0,1,17"

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

sapply(strsplit(df1$a_3, ","), function(x) length(which(x>0)))
[1] 2

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

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:

string_a <- as.numeric(unlist(strsplit(df1$a, ",")))
string_a
[1]   0   1  17 200   6   0   1

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

max(string_a)
[1] 200

sum(string_a)
[1] 225

关于等于 0 的值的数量,通过设置 x == 0:

调整您的 sapply 语句
sapply(strsplit(df1$a, ","), function(x) length(which(x == 0)))
[1] 2

希望对您有所帮助!