首先:新年快乐:)
我正在循环中挣扎,所以现在正在寻求您的帮助。
下面是一个简短的假人:
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))
我想比较name
,type
和area
的每个唯一组合,看看length
和power
是否有所不同。如果他们不这样做,我想保留他们的价值。如果他们这样做,我想用“未知”代替它们的值。
因此,在以上示例中,将仅替换name
= b:length
将保持为'10',而power
将变为'Unknown'。结果,所得数据帧将仅具有五行。
这似乎是一个非常简单的循环,但是到目前为止我还没有成功……你有什么主意吗?
干杯
弗雷德
答案 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; }
}
}
。
首先查找具有相同的duplicated
,name
,type
和area
但没有相同功效值的行。将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
对于给定的“名称”,“类型”和“区域”组合,它检查值是否与第一行的值相同。如果没有,它将用“未知”填充行。