【问题标题】:Fill specific values in a data frame using another column as an index使用另一列作为索引填充数据框中的特定值
【发布时间】:2012-12-19 11:45:36
【问题描述】:

我有一个如下所示的数据框:

species<-"ABC"
ind<-rep(1:4,each=24)
hour<-rep(seq(0,23,by=1),4)
month<-rep(seq(1,12),8)
depth<-runif(length(ind),1,50)
df<-data.frame(species,ind,month,hour,depth)

我想要的是使用月份列来指定每个季节的间隔,并将这些值返回到来自同一数据框的新列中。我一直在使用这个代码,这似乎工作正常,

# Classify months into seasons

summer<-c(1,2,12)
fall<-c(3,4,5)
winter<-c(6,7,8)
spring<-c(9,10,11)

# Create a new column with seasons

df$season<-NA
for(i in 1:nrow(df)){
  if(df$month[i]%in%summer){df$season[i]<-"1-summer"} else
    if(df$month[i]%in%fall){df$season[i]<-"2-fall"} else
      if(df$month[i]%in%winter){df$season[i]<-"3-winter"} else
        if(df$month[i]%in%spring){df$season[i]<-"spring"} 

}

但是,这个循环已经在一个更大的循环内部,它具有更复杂和更大的数据库。所以我一直在寻找一种更快、更有效的方法。我使用循环而不是切割或子集原始数据框的原因是因为我使用的第一个循环是对个体动物进行分离和分析。结果数据框的长度因动物而异,我遇到的一个问题是并非所有动物都在所有月份都存在,所以当我试图在循环内为特定季节不存在的动物分配季节时, 然后 R 给了我一个错误信息...

【问题讨论】:

标签: r loops conditional-statements intervals


【解决方案1】:
seasons <- c("1-summer", "2-fall", "3-winter", "spring")
df$season2 <- factor(trunc(df$month %% 12 / 3) + 1, labels = seasons)
table(df$season, df$season2)

您可以根据需要将df$season2 转换为character

【讨论】:

  • 它不起作用。它给了我这个错误消息“因子错误(trunc(df$month%%12/3)+ 1,标签=季节):无效标签;长度4应该是1或0”
  • @user1626688 您收到此错误是因为您没有在数据框df 中包含month。如果将列 month 添加到数据框中,djhurio 的解决方案和循环都将起作用。
  • 我正在尝试在我的真实脚本中运行此代码,但它给了我一个类似的错误消息“无效标签;长度 4 应该是 1 或 1”。有些人只有 10 月和 11 月的数据。这段代码会出现问题吗?
  • 奇怪,我没有收到示例数据的错误。如果某些东西不起作用,请尝试简化。删除factor。这行得通吗? df$season2 &lt;- trunc(df$month %% 12 / 3) + 1
  • 这个例子很好。这段代码似乎工作正常,但是当我尝试在真实数据上运行代码时(由于我研究中的一些动物只存在 3 或 4 个月,这些数据并不总是有所有月份),然后我收到一条错误消息。我不确定是否需要所有月份,以便代码可以指定所有季节。例如,如果缺少夏季月份,那么我不知道它是否仍然有效?
【解决方案2】:

我只是为季节名称生成查找表并应用它:

> season.names <- rep("",12)
> season.names[summer] <- "1-summer"
> season.names[fall] <- "2-fall"
> season.names[winter] <- "3-winter"
> season.names[spring] <- "4-spring"
> season.names
 [1] "1-summer" "1-summer" "2-fall"   "2-fall"   "2-fall"   "3-winter" "3-winter"
 [8] "3-winter" "4-spring" "4-spring" "4-spring" "1-summer"
> df$season <- season.names[df$month]
> head(df)
  species ind month hour     depth   season
1     ABC   1     1    0 41.643471 1-summer
2     ABC   1     2    1 36.055533 1-summer
3     ABC   1     3    2  1.901639   2-fall
4     ABC   1     4    3  7.737539   2-fall
5     ABC   1     5    4 35.327364   2-fall
6     ABC   1     6    5  9.156978 3-winter

【讨论】:

  • 我正在尝试对“白天”/“夜晚”使用相同的方法,但我注意到第 23 小时的最后一个“夜晚”没有显示,因此代码无法正常运行。有什么建议么? day
  • 问题是小时从 0 开始到 23,但是向量 diel.names 必须从 1 到 24 进行索引。处理这个问题的一种方法是索引 @987654322 @指小时i-1:diel.names[day+1]&lt;-"day" ; diel.names[night+1]&lt;-"night"; df$diel &lt;- diel.names[df$hour+1].
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
  • 2019-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
相关资源
最近更新 更多