R 如何将函数应用于多个列?

R 如何将函数应用于多个列?,r,R,对于下面的数据集,我编写了一个函数 expconvert <- function(a) { if(a=="h" || a=="H") return(100) if(a=="k" || a=="K") return(1000) if(a=="m" || a=="M") return(1000000) if(a=="b" || a=="B") return(1000000000)

对于下面的数据集,我编写了一个函数

expconvert <- function(a) {
     if(a=="h" || a=="H")
         return(100)
     if(a=="k" || a=="K")
         return(1000)
     if(a=="m" || a=="M") 
         return(1000000)
     if(a=="b" || a=="B")
         return(1000000000)
     if(is.numeric(a))
         return(a)
     else
         return(0)
}
转换后的数据集应如下所示:

CROPDMGEXP CROPDMG PROPDMG PROPDMGEXP
   1000        0       20        100
   100         23      41        1000000000
   1000        10      5         1000000000  
   0           2       3         1000 
   0           5       50        0 
我希望将上述函数应用于第一列和最后一列。当编写以下代码时,请考虑<代码> df>代码>作为上述数据帧


df[c(1,4)]我们可以使用
lappy
而不是
apply
,因为
lappy
保持了列的相同结构,而
apply
将转换为
矩阵
,而
矩阵
只能有一个

df[c(1, 4)] <- lapply(df[c(1, 4)], expconvert)
数据
df列的边距为2。此外,我假设函数没有正确定义以提供正确的输出。我在@RonakShah尝试了它,但函数对每个字母返回0。这是不应该的。不完全是@RonakShah我检查了这个问题。问题是,数据集中有很多级别,所以当只有很少级别时,setNames是很酷的。这就是我编写函数的原因。问题是,该函数对于带apply的单列运行良好,但当与带apply的多列一起使用时返回错误的值。@akrun ok,然后我将投票以“代码不工作,但没有代表性示例”结束如果你的方法不起作用,那么我们确实无法找到解决问题的方法,因为我们没有足够的资源information@akrun你应该取消删除你的答案。对于给定的示例,它是最好的。如果Q不能代表更大的数据集,这不是你的错。尝试使用lappy@akrun时,问题是它返回1000个不正确的值。你是对的,但有一个问题,因为数据集非常大,我没有包括所有的情况,也可以是整数,如1、3、32等。所以我们应该直接按原样处理它们。这就是我使用该函数的原因。如果你能帮我找出哪里出了问题,那将是一个很大的帮助。@NiranjanAgnihotri我的第二个代码得到的输出与你想要的完全相同是的,你是对的。它适用于小型数据集。但是在CROPDMGEXP中有大约40个级别,函数按原样抛出整数。使用
setNames
我必须对所有级别进行编码。如何绕过它?@Niranjanagnihoter我们只能根据你展示的内容编写代码。我不知道你的期望是什么,当数据显示只有这么多的水平
df[c(1, 4)] <- lapply(df[c(1, 4)], expconvert)
v1 <- setNames(c(100, 1000, 1000000, 1000000000), c('h', 'k', 'm', 'b'))
df[c(1, 4)] <- lapply(df[c(1, 4)], function(x) v1[tolower(x)])
df[is.na(df)] <- 0
df
#   CROPDMGEXP CROPDMG PROPDMG PROPDMGEXP
#1       1000       0      20        100
#2        100      23      41 1000000000
#3       1000      10       5 1000000000
#4          0       2       3       1000
#5          0       5      50          0
df <- structure(list(CROPDMGEXP = c("k", "H", "k", "", ""), CROPDMG = c(0L, 
23L, 10L, 2L, 5L), PROPDMG = c(20L, 41L, 5L, 3L, 50L), PROPDMGEXP = c("h", 
"B", "B", "k", "")), .Names = c("CROPDMGEXP", "CROPDMG", "PROPDMG", 
"PROPDMGEXP"), class = "data.frame", row.names = c(NA, -5L))