R - 如何将不同的函数应用于列中的某些行

Tho*_*mas 5 r

我试图根据相邻列中的字符串值将不同的函数应用于不同的行.我的数据框看起来像这样:

type    size
A       1
B       3
A       4
C       2
C       5
A       4
B       32
C       3
Run Code Online (Sandbox Code Playgroud)

我想对A,B和C类型应用不同的函数,以给出第三列"size2"列.例如,假设以下函数适用于A,B和C:

for A: size2 = 3*size
for B: size2 = size
for C: size2 = 2*size 
Run Code Online (Sandbox Code Playgroud)

我可以使用此代码分别为每种类型执行此操作

df$size2 <- ifelse(df$type == "A", 3*df$size, NA)
df$size2 <- ifelse(df$type == "B", 1*df$size, NA)
df$size2 <- ifelse(df$type == "C", 2*df$size, NA)
Run Code Online (Sandbox Code Playgroud)

但是,在没有删除所有其他值的情况下,我似乎无法对所有类型执行此操作.我试图使用此代码将函数的应用程序仅限制为NA的值(即保留现有值并仅填充NA值),但使用此代码时无效:

df$size2 <- ifelse(is.na(df$size2), ifelse(df$type == "C", 2*df$size, NA), NA)
Run Code Online (Sandbox Code Playgroud)

有没有人有任何想法?是否有可能使用某种类型和语句"is.na(DF size2个$)"和"ifelse(DF $类型=='C’"?

非常感谢!

42-*_*42- 5

这可能更R-ish(我将我的数据帧称为“dat”而不是“df”,因为它df是一个常用的函数。

> facs <- c(3,1,2)
> dat$size2= dat$size* facs[ match( dat$type, c("A","B","C") ) ]
> dat
  type size size2
1    A    1     3
2    B    3     3
3    A    4    12
4    C    2     4
5    C    5    10
6    A    4    12
7    B   32    32
8    C    3     6
Run Code Online (Sandbox Code Playgroud)

match函数用于构造索引以提供给 extract 函数[


use*_*1_G 3

如果你愿意,你可以嵌套ifelses:

df$size2 <- ifelse(df$type == "A", 3*df$size,
                       ifelse(df$type == "B", 1*df$size,
                           ifelse(df$type == "C", 2*df$size, NA)))


#    > df
#  type size size2
#1    A    1     3
#2    B    3     3
#3    A    4    12
#4    C    2     4
#5    C    5    10
#6    A    4    12
#7    B   32    32
#8    C    3     6
Run Code Online (Sandbox Code Playgroud)