我试图根据相邻列中字符串的值将不同的函数应用于不同的行。我的数据框看起来像这样:
type size
A 1
B 3
A 4
C 2
C 5
A 4
B 32
C 3
我希望将不同的函数应用于类型A,B和C,以提供第三列“size2”列。例如,假设以下函数适用于A,B和C:
for A: size2 = 3*size
for B: size2 = size
for C: size2 = 2*size
我可以使用此代码
分别为每种类型执行此操作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)
但是,如果不删除所有其他值,我似乎无法对所有类型执行此操作。我试图使用此代码将函数的应用程序仅限制为NA的值(即保留现有值并仅填充NA值),但使用此代码无效:
df$size2 <- ifelse(is.na(df$size2), ifelse(df$type == "C", 2*df$size, NA), NA)
有没有人有任何想法?是否可以使用某种AND语句“is.na(df $ size2)”和“ifelse(df $ type ==”C“”?
非常感谢!
答案 0 :(得分:4)
这可能是一个可能更多的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
match
函数用于构造索引以提供提取函数[
。
答案 1 :(得分:2)
如果您愿意,可以嵌套ifelse
s:
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
答案 2 :(得分:0)
这可以这样做,为每种类型创建单独的逻辑向量:
As <- df$type == 'A'
Bs <- df$type == 'B'
Cs <- df$type == 'C'
df$size2[As] <- 3*df$size[As]
df$size2[Bs] <- df$size[Bs]
df$size2[Cs] <- 2*df$size[Cs]
但更直接的方法是创建一个单独的查找表,如下所示:
df$size2 <- c(A=3,B=1,C=2)[as.character(df$type)] * df$size