我有一个用数字逗号分隔的字符串的列,例如'0,1,17,200,6,0,1'。我想为字符串中那些数字(或子字符串)的和创建新的列,这些数字(或子字符串)是而不是等于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个子字符串的计数?
发布于 2020-03-04 12:29:19
您可以使用gsub和backreference将字符串裁剪到所需的长度,然后才算出有多少子字符串大于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的值数,通过设置sapply语句来调整x == 0语句
sapply(strsplit(df1$a, ","), function(x) length(which(x == 0)))
[1] 2希望这能有所帮助!
https://stackoverflow.com/questions/60521978
复制相似问题