如何读取逗号分隔的数字字符串并对其执行各种功能
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_3
, df1$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
希望对您有所帮助!
我有一列包含以逗号分隔的数字字符串,例如 '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_3
, df1$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
希望对您有所帮助!