简体   繁体   English

使用R中的合并转换数据框中的一列元素

[英]transform one column elements in a data frame using merge in R

I would like to transform data for data frame data as shown below. 我想将数据转换为数据帧数据,如下所示。

> d<-c("A", "B", "C", "D")
> order <- c("1-A","3-B","2-C","4-D")
> matchtable<-data.frame(d,order)
> matchtable
  d order
1 A   1-A
2 B   3-B
3 C   2-C
4 D   4-D

which means A-> 1-A, B -> 3-B etc. 这意味着A-> 1-A,B-> 3-B等。
my data frame data is 我的数据框数据是

> id<- 1:10
> Type<-c(rep("A",3),"D",rep("B",4),"A","C")
> data<-data.frame(id,Type)
> data

       id Type
    1   1    A
    2   2    A
    3   3    A
    4   4    D
    5   5    B
    6   6    B
    7   7    B
    8   8    B
    9   9    A
    10 10    C

My ideal answer would be 我的理想答案是

> IDEAL <- c(rep("1-A",3),"4-D",rep("3-B",4),"1-A","2-C")
> newdata <- data.frame(id, IDEAL)
> newdata
   id IDEAL
1   1   1-A
2   2   1-A
3   3   1-A
4   4   4-D
5   5   3-B
6   6   3-B
7   7   3-B
8   8   3-B
9   9   1-A
10 10   2-C

i tried using following code with error message 我尝试将以下代码与错误消息一起使用

> merge(matchtable, table, by.x="d", by.y="id")
Error in fix.by(by.y, y) : 'by' must specify a uniquely valid column

Thanks for your gentle help 多谢您的协助

I would just reformat "matchtable" to a named vector, then this works: 我只是将“ matchtable”重新格式化为命名向量,然后工作了:

order <- c("1-A","3-B","2-C","4-D")
names(order) <- c("A", "B", "C", "D")
id <- 1:10
Type <- c(rep("A",3),"D",rep("B",4),"A","C")
data <- data.frame(id,Type)

data.frame(data$id, "IDEAL"=order[data$Type])

You should still use merge IMHO 您仍然应该使用merge恕我直言

merge(data, matchtable, by.x = "Type", by.y = "d")
##    Type id order
## 1     A  1   1-A
## 2     A  2   1-A
## 3     A  3   1-A
## 4     A  9   1-A
## 5     B  6   3-B
## 6     B  7   3-B
## 7     B  8   3-B
## 8     B  5   3-B
## 9     C 10   2-C
## 10    D  4   4-D

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM