如何解决使用ifelse将值分配给R中的新数据框列
我有一个时间序列数据帧,并想创建一个新的数字列,其值是现有数字列的函数,并根据星期几列进行分配。
例如,我将需要以下代码:
Day <- c("Mo","Mo","Tu","We","Th")
Val <- c(1000,1000,1000)
df <- data.frame(cbind(Day,Val))
df$Adj <- ifelse(df$Day == "Mo" || df$Day == "Tu",as.numeric(levels(df$Val)) + 1,as.numeric(levels(df$Val)) + 2)
返回:
Day Val Adj
1 Mo 1000 1001
2 Mo 1000 1001
3 Mo 1000 1001
4 Tu 1000 1001
5 Tu 1000 1001
6 We 1000 1002
7 We 1000 1002
8 We 1000 1002
9 We 1000 1002
10 Th 1000 1002
不幸的是,我的代码只将Adj作为1001s列返回。
Day Val Adj
1 Mo 1000 1001
2 Mo 1000 1001
3 Mo 1000 1001
4 Tu 1000 1001
5 Tu 1000 1001
6 We 1000 1001
7 We 1000 1001
8 We 1000 1001
9 We 1000 1001
10 Th 1000 1001
我已经在“ We”行之一上测试了ifelse,并且可以解决问题...
> ifelse(df$Day[6] == "Mo" || df$Day[6] == "Tu",+ as.numeric(levels(df$Val[6])) + 1,+ as.numeric(levels(df$Val[6])) + 2)
[1] 1002
...但是我似乎无法使其在整个列上都能工作,据我了解,这是ifelse函数相对于循环的if-else语句的优势之一。
我的方法基于我能找到的最相似的问题 (Create new column in dataframe using if {} else {} in R),但没有喜悦。我在这里想念什么?
解决方法
使用dplyr:
Day <- c("Mo","Mo","Tu","We","Th")
Val <- c(1000,1000,1000)
df <- data.frame(Day,Val)
library(dplyr)
df %>% rowwise %>% mutate(Adj = ifelse(Day == "Mo" || Day == "Tu",Val + 1,Val + 2))
#> # A tibble: 10 x 3
#> Day Val Adj
#> <chr> <dbl> <dbl>
#> 1 Mo 1000 1001
#> 2 Mo 1000 1001
#> 3 Mo 1000 1001
#> 4 Tu 1000 1001
#> 5 Tu 1000 1001
#> 6 We 1000 1002
#> 7 We 1000 1002
#> 8 We 1000 1002
#> 9 We 1000 1002
#> 10 Th 1000 1002
请注意,df <- data.frame(cbind(Day,Val))
会将Val转换为character
,这可能不是您想要的。
您可以将其简化为df <- data.frame(Day,Val)
我们可以使用%in%
来检查Day
的值为c('Mo','Tu')
,并在Val
上加上1或2。
df <- transform(df,Adj = Val + ifelse(Day %in% c('Mo','Tu'),1,2))
#you can do this without `ifelse` as well.
#df <- transform(df,Adj = Val + as.integer(!Day %in% c('Mo','Tu')) + 1)
df
# Day Val Adj
#1 Mo 1000 1001
#2 Mo 1000 1001
#3 Mo 1000 1001
#4 Tu 1000 1001
#5 Tu 1000 1001
#6 We 1000 1002
#7 We 1000 1002
#8 We 1000 1002
#9 We 1000 1002
#10 Th 1000 1002
,
在尝试尊重与此问题相关的经验水平时,在问题中使用循环的那些函数也用于提供答案。可以使用以下代码完成获得预期结果的一种方法:
Adj <- list() # assign an empty list
for(i in 1: nrow(df)) { # For loop
if(df$Day[i] == "Mo" || df$Day[i] == "Tu") { # the conditional ifelse loop
Adj[i] <- c(1000 + 1) # The 1000 can be replaced w/ Val[i]
} else {
Adj[i] <- c(1000 + 2)
}
}
Adj <- as.numeric(paste0(Adj)) # Convert list to numeric vector
df <- cbind(df,Adj) # Combine the df with the new vector
df # print results
可以从此link:
查看结果版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。