比较行并替换有差异的值

时间:2019-01-02 11:33:39

标签: r loops

首先:新年快乐:)

我正在循环中挣扎,所以现在正在寻求您的帮助。

下面是一个简短的假人:

df <- data.frame(name = c("a","a","b","b","c","d"), type = c(1,1,2,2,3,4), area = c("a","b","a","a","b","b"), length = c(10), power = c(10, 100))

我想比较nametypearea的每个唯一组合,看看lengthpower是否有所不同。如果他们不这样做,我想保留他们的价值。如果他们这样做,我想用“未知”代替它们的值。 因此,在以上示例中,将仅替换name = b:length将保持为'10',而power将变为'Unknown'。结果,所得数据帧将仅具有五行。

这似乎是一个非常简单的循环,但是到目前为止我还没有成功……你有什么主意吗?

干杯

弗雷德

2 个答案:

答案 0 :(得分:2)

我认为您不需要for循环,但可以使用using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Text; namespace Treat_Data.Model { public class Restaurant { [Key] public int Restaurant_ID { get; set; }//this is the primary key public string Name { get; set; } public string Address { get; set; } public string Open_Hours { get; set; } } } 。 首先查找具有相同的duplicatednametypearea但没有相同功效值的行。将length之一替换为power

Unknown

下一步,创建一个丢弃另一行的新数据框

df[which(duplicated(df[1:4]) & !duplicated(df[1:5])),'power'] <- 'Unkown'

输出:

df2 <- df[which(!duplicated(df[1:4],fromLast = T)),] 

编辑:在OP提出其他要求之后,这是一个适用于更一般情况的dplyr解决方案。

> df2
  name type area length  power
1    a    1    a     10     10
2    a    1    b     10    100
4    b    2    a     10 Unkown
5    c    3    b     10     10
6    d    4    b     10    100

该功能首先按名称,类型和区域分组。接下来,它检查是否有多于1行,如果为true,则检查值是否变化,如果均为真,则将所有值替换为“未知”。

输出:

# New dataframe; containing multiple duplicates
df3 <- data.frame(name = c("a","a","b","b","b","c","d"),
type = c(1,1,2,2,2,3,4), area = c("a","b","a","a","a","b","b"), 
length = rep(10,7), 
power = c(10, 100, 10, 100,100,10,100))


df3 %>% 
  group_by(name, type, area) %>% 
  mutate(length = ifelse(n() > 1 && var(length) != 0, "Unknown", paste0(length)),
    power = ifelse(n() > 1 && var(power) != 0, "Unknown", paste0(power)))

答案 1 :(得分:1)

使用dplyr,您可以执行以下操作:

df %>%
 group_by(name, type, area) %>%
 mutate(length = ifelse(length != first(length), "Unknown", paste0(length)),
        power = ifelse(power != first(power), "Unknown", paste0(power)))

  name   type area  length power  
  <fct> <dbl> <fct> <chr>  <chr>  
1 a        1. a     10     10     
2 a        1. b     10     100    
3 b        2. a     10     10     
4 b        2. a     10     Unknown
5 c        3. b     10     10     
6 d        4. b     10     100 

对于给定的“名称”,“类型”和“区域”组合,它检查值是否与第一行的值相同。如果没有,它将用“未知”填充行。