R 如何对数据表中单个列中的值进行算术操作?

R 如何对数据表中单个列中的值进行算术操作?,r,R,在data.table中有一列,其中包含我想用算术方法处理的因子。我想对每个比率左侧的三个值求和,对比率右侧的三个数字求和,然后将求和的值作为比率返回。这很难解释,但如果我将其作为数据表的一部分: FattyAcid 1 4:0/16:0/16:0 2 16:0/16:0/18:1 3 18:1/14:0/18:1 然后我想返回数据表 FattyAcid Assignment 1 4:0/16:0/16:0 36:0 2 1

在data.table中有一列,其中包含我想用算术方法处理的因子。我想对每个比率左侧的三个值求和,对比率右侧的三个数字求和,然后将求和的值作为比率返回。这很难解释,但如果我将其作为数据表的一部分:

     FattyAcid
1    4:0/16:0/16:0
2    16:0/16:0/18:1
3    18:1/14:0/18:1
然后我想返回数据表

     FattyAcid        Assignment
1    4:0/16:0/16:0    36:0
2    16:0/16:0/18:1   50:1
3    18:1/14:0/18:1   50:2
i、 e.对于条目1,(4+16+16):(0+0+0)=36:0

当我在str函数中调用数据集时,它显示相关列是:“Factor w/179 levels”(10:0/10:0/12:0)”,..:112 104 114 33 61 115 106 30 60 66…”

编辑:我找到了一个解决方案,但它并不优雅。基本上,我必须使用tstrsplit()分离这些值并将它们粘贴到新列中,最终生成六列。然后将它们转换为数字(从字符),组合相关列,然后再次组合该结果。然后我只删除旧列。我确信有更好的方法,但我想它是有效的:)

####将脂肪酸因子分为三列,以“/”分隔,即单个ID的脂肪酸。
###同时拆下起动支架和尾部支架
setDT(LipidDataShortest)[,paste0(“FattyAcid”,1:3):=tstrsplit(FattyAcid,“/”)]

LipidDataShortest请提供一个可复制的示例。通常,使用
file.choose()
不是重现任何问题的好方法。您可能会混淆(或不清楚区分)R数据类型
因子
和数据中的解释变量。这类问题除了代码外,还需要查看示例数据,否则一切都是推测。你们已经接近成功了,只要再努力一点,你们就会“足够成功”。谢谢你们。我编辑了原始的帖子,以展示我希望的是一个具有小数据表的可复制示例。r2evans,你说得对,我肯定我混淆了R数据类型因子和解释变量!我已经想出了一个解决办法,但我相信有更好的办法,但是,嘿,它是有效的!
### split up the fatty acid factors into three columns separated by "/"     i.e. individual ID'd fatty acids.
### also remove the starting and trailing brackets
setDT(LipidDataShortest)[, paste0("FattyAcid", 1:3) := tstrsplit(FattyAcid, "/")]
LipidDataShortest <- as.data.table(sapply(LipidDataShortest, gsub, pattern="[(]", replacement = ""))
LipidDataShortest <- as.data.table(sapply(LipidDataShortest, gsub, pattern="[)]", replacement = ""))

### small issue - also removes bracket from "FattyAcid" column. Way to remove only from specific columns?

### split up the specific fatty acids into number of carbons and number of double bonds
setDT(LipidDataShortest)[, paste0("FattyAcidOne", 1:2) := tstrsplit(FattyAcid1, ":")]
setDT(LipidDataShortest)[, paste0("FattyAcidTwo", 1:2) := tstrsplit(FattyAcid2, ":")]
setDT(LipidDataShortest)[, paste0("FattyAcidThree", 1:2) := tstrsplit(FattyAcid3, ":")]

### convert from character to numeric
LipidDataShortest$FattyAcidOne1 <- as.numeric(LipidDataShortest$FattyAcidOne1)
LipidDataShortest$FattyAcidOne2 <- as.numeric(LipidDataShortest$FattyAcidOne2)
LipidDataShortest$FattyAcidTwo1 <- as.numeric(LipidDataShortest$FattyAcidTwo1)
LipidDataShortest$FattyAcidTwo2 <- as.numeric(LipidDataShortest$FattyAcidTwo2)
LipidDataShortest$FattyAcidThree1 <- as.numeric(LipidDataShortest$FattyAcidThree1)
LipidDataShortest$FattyAcidThree2 <- as.numeric(LipidDataShortest$FattyAcidThree2)

### combine the columns to get total carbons and create new column for that, then repeat for alkenes
setDT(LipidDataShortest)[, paste0("Carbons", 1) := LipidDataShortest$FattyAcidOne1 + LipidDataShortest$FattyAcidTwo1 + LipidDataShortest$FattyAcidThree1 ]
setDT(LipidDataShortest)[, paste0("DoubleBonds", 1) := LipidDataShortest$FattyAcidOne2 + LipidDataShortest$FattyAcidTwo2 + LipidDataShortest$FattyAcidThree2 ]

### combine final assignments into new column and delete the unnecessary columns used to get to this point
LipidDataShortest$Assignment <- paste(LipidDataShortest$Carbons1, LipidDataShortest$DoubleBonds1, sep = ":")
LipidDataShortest <- LipidDataShortest[, -c(10:20)]