给定一个带有列的数据框:


“ length1”整数作为字符
“ length2”的每个元素都是一串数字


我想获得length2列相对于length1列的百分比。因此,例如df $ length2 / df $ lenght1 * 100。
请参阅以下最小示例:

> df=data.frame(length1=c("10","12","14"))
> df$length2=list("2,3,4","4,5,3","3,2,6")
> df

length1 length2
1      10   2,3,4
2      12   4,5,3
3      14   3,2,6

> dfresult=df
> dfresult$resultInPercent=list("20,30,40","33,41,25","21,14,42")
> dfresult

  length1 length2 resultInPercent
1      10   2,3,4        20,30,40
2      12   4,5,3        33,41,25
3      14   3,2,6        21,14,42


我无法使其正常工作,我的方法是:

dfresult=apply(df, 1, function(x)
{

  lapply(lapply(lapply(x$length2,strsplit,split=","),as.numeric),function(y)
     {
        round(as.numeric(y)/as.numeric(x$length1)*100)
     }

  )
 }
)



lapply(lapply(x $ length2,strsplit,split =“,”),as.numeric中的错误
:(列表)对象不能被强制键入'double'


我放弃了这里,感觉到我要做的就是变得复杂。

最佳答案

由于列是factor类,因此我们在使用定界符character转换为,类后将'length2'拆分,将list中的元素转换为numeric,使用mapply划分list与相应的vector元素为'length1',round输出并转换为单个字符串(toStringpaste(., collapse=", ")的包装器)

mapply(function(x,y) toString(round(x/y)),
    lapply(strsplit(as.character(df$length2), ","), as.numeric),
      as.numeric(as.character(df$length1))/100)
#[1] "20, 30, 40" "33, 42, 25" "21, 14, 43"

09-06 07:26