2016-09-16 43 views
0

我基本上是使用R软件的新手。用于重复值列的R代码

我有一个Excel文件重复代码(数值/分类)的列表。我需要添加另一个列值(即使是随机的),每个相同的代码将获得相同的值。

Codes Value 
1 122 
1 122 
2 155 
2 155 
2 155 
4 101 
4 101 
5 251 
5 251 

谢谢。

回答

0

我们可以用match

n <- length(code0 <- unique(code)) 
value <- sample(4 * n, n)[match(code, code0)] 

factor

n <- length(unique(code)) 
value <- sample(4 * n, n)[factor(code)] 

生成的随机整数是1和4 * n之间。号码4是任意的;你也可以把100


set.seed(0); code <- rep(1:5, sample(5)) 

code 
# [1] 1 1 1 1 1 2 2 3 3 3 3 4 4 4 5 

n <- length(code0 <- unique(code)) 
sample(4 * n, n)[match(code, code0)] 

# [1] 5 5 5 5 5 18 18 19 19 19 19 12 12 12 11 

评论上面

给出最一般的治疗,假定code不容易排序或连续服用值。

如果code排序(不管需要什么样的价值),我们也可以使用rle

if (!is.unsorted(code)) { 
    n <- length(k <- rle(code)$lengths) 
    value <- rep.int(sample(4 * n, n), k) 
    } 

如果code需要连续值1, 2, ..., n(但不一定排序),我们可以跳过matchfactor和这样做:

n <- max(code) 
value <- sample(4 * n, n)[code] 

另行通知:如果code不是数字但是是分类的,则matchfactor方法仍然有效。

+0

尝试这个!它完全工作!谢谢。 – icychamp

+0

当我的代码变量是字符时它会工作吗?而当我引入另一列B时,就像我的数据框不仅包含上面的那两列一样? – icychamp

0

什么你也可以做的是下面的,它可能是更直观的初学者:

data <- data.frame('a' = c(122,122,155,155,155,101,101,251,251)) 

duplicates <- unique(data) 
duplicates[, 'b'] <- rnorm(nrow(duplicates)) 

data <- merge(data, duplicates, by='a') 
+0

谢谢!它运作良好:) – icychamp