我有一个4列的df,第4列实际上是一个字符串,数字用“,”分隔。
chrom peakStart peakEnd CpGPos
chr10 117952993 117953593 111,304,470,566,577
chr10 25219070 25219670 92,162,301,354,385,450,483
chr10 4333197 4333797 241,488,493,502,547,597
chr10 64090001 64090601 265,269,282,439,465,499,515,527,585,594
chr10 68541389 68541989 503,511,525
chr10 84836010 84836610 18,69,92,139,344,403,488
我想将第4列拆分为“,”然后从300中减去每个值,并填充新列中所有值的最小值。例如
chrom peakStart peakEnd CpGPos minimumDis
chr10 117952993 117953593 111,304,470,566,577 -4
我无法正确拆分以获取可以运行某些操作的数字向量。任何指针都有帮助。
ST
答案 0 :(得分:2)
尝试
df$new_col <- sapply(strsplit(df$col4, split = ","), function(x) 300 - min(as.numeric(x)))
如果您正在寻找最小的绝对距离,您可以相应地修改内容:
df$new_col <- sapply(strsplit(df$col4, split = ","), function(x) min(abs(300 - as.numeric(x))))
或(保留标志)
df$new_col <- sapply(strsplit(df$col4, split = ","), function(x) {
tmp <- 300 - as.numeric(x)
sign(tmp[which.min(abs(tmp))]) * min(abs(tmp))
})
(更新以反映对Rui Barradas的sign
的更正)