R:找到具有非唯一/重复值的数据帧索引

时间:2017-08-25 15:53:38

标签: r indexing duplicates

我想从矢量中提取一些值,修改它们并将它们放回原始位置。
我一直在搜索并尝试不同的方法来解决这个问题。我担心这可能很简单,但我还没有看到它。

创建一个矢量并将其转换为数据帧。还为结果创建一个空数据框。

hight <- c(5,6,1,3)
hight_df <- data.frame("ID"=1:length(hight), "hight"=hight)
hight_min_df <- data.frame()

为每对值提取较小的值和相应的ID。

for(i in 1:(length(hight_df[,2])-1))
{
  hight_min_df[i,1] <- which(grepl(min(hight_df[,2][i:(i+1)]), hight_df[,2]))
  hight_min_df[i,2] <- min(hight_df[,2][i:(i+1)])
}

修改提取的值并使用更高的值聚合相同的ID。最后写回修改后的值。

hight_min_df[,2] <- hight_min_df[,2]+20  
adj_hight <- aggregate(x=hight_min_df[,2],by=list(hight_min_df[,1]), FUN=max)
hight[adj_hight[,1]] <- adj_hight[,2]

只要hight中只有uniqe值,这就完美无缺。 如何使用这样的向量运行此脚本:hight <- c(5,6,1,3,5)

1 个答案:

答案 0 :(得分:0)

好的,这里有很多要打开的东西。我建议使用dplyr来管理函数,而不是循环。阅读小插图here - 这是一个出色的资源,也是R中数据处理的绝佳方法。

因此,使用dplyr我们可以像这样重写您的代码:

library(dplyr)
hight <- c(5,6,1,3,5) #skip straight to the test case
hight_df <- data.frame("ID"=1:length(hight), "hight"=hight)

adj_hight <- hight_df %>%
  #logic psuedo code: if the last hight (using lag() function),
  # going from the first row to the last,
  # is greater than the current rows hight, take the current rows value. else
  # take the last rows value
  mutate(subst.id = ifelse(lag(hight) > hight, ID, lag(ID)), 
         subst.val = ifelse(lag(hight) > hight, hight, lag(hight)) + 20) %>%
  filter(!is.na(subst.val)) %>% #remove extra rows
  select(subst.id, subst.val) %>% #take just the columns we want
  #grouping - rewrite of your use of aggregate
  group_by(subst.id) %>% 
  summarise(subst.val = max(subst.val)) %>%
  data.frame(.)

#tying back in
hight[adj_hight[,1]] <- adj_hight[,2]
print(hight)

,并提供:

[1] 25  6 21 23  5