合并在同一data.frame中的R中的两列没有任何条件并找到唯一值

时间:2015-04-04 16:45:14

标签: r dataframe

我有一个data.frame df,如下所述

    V1 V2
4   b  c
14  g  h
10  d  g
6   b  f
2   a  e
5   b  e
12  e  f
1   a  b
3   a  f
9   c  h
11  d  h
7   c  d
8   c  g
13  f  g

第一列是row.names列,所以只需忽略它。现在看第二列V1和V2。我想找到V1和V2列中的独特元素。因此,如果您看到V1,唯一元素是b,g,d,a,e,c,f,并且在V2中,唯一元素是c,h,g,f,e,b,d。现在,如果您查看上面列出的这些独特元素。即使是元素在V1和V2中也很常见,即b,g,d,a,e,c和f。

所以我需要创建一个新的data.frame,其中有一列列出了考虑V1和V2的所有独特元素。通过唯一元素,我指的是存在于V1或V2或两者中的元素,但它们不应在此新data.frame中重复列出,因此我想要的data.frame列在下面。如果列表按字母顺序排序会更好(如果值是字母表,如a,b,c,d ......或者如果元素是1,2,3,则按升序排列。

UniqueValues
a
b
c
d
e
f
g
h

假设这个新的data.frame被称为UV1,我有一个类似的data.frame,其中一列的行数相同或更大或更小,称​​为UV2(并且是其他类似操作的结果)我可以比较这两个data.frames,即比较UV1和UV2,并找到这些data.frames和值中相同的值,这些值在这些data.frames和将它们保存在2个不同的data.frames中,如(similarValuesdf)和(differentValuesdf)data.frames?

我是初学者,所以我更喜欢更简单的代码,而不是在单个语句中执行5-10个操作,就像我在其他回复中看到的那样。我明白这是为了节省时间,那些专业人员会经历很多事情来弄清楚用两行代码来执行整个事情,但我只是想学习,所以我真的很感激代码。 提前谢谢。

4 个答案:

答案 0 :(得分:3)

我认为最好的方法是将列连接到一个向量中,然后使用df.pivot_table(index='Date', columns='Currency', aggfunc=np.sum) 函数:

my_list = ["2017-07-01", "ABC",312, 31, "Pounds",  "2017-07-01", "XYZ" ,323, 41, "Pounds",
           "2017-07-02", "ABC", 423, 21, "Dollars", "2017-07-02", "XYZ" ,335, 32, "Pounds",
           "2017-07-03", "ABC", 421, 21, "Dollars", "2017-07-03", "XYZ", 304, 21, "Pounds" ]
df_raw = pd.DataFrame(np.array(my_list).reshape(6,5),
                   columns = ["Date", "Manufacturer", "Cost", "Transport", "Currency"])
df = df_raw.pivot(index='Date', columns='Manufacturer')

按字母顺序排列unique()将是一个不错的选择。

unique(c(DF$V1,DF$V2))
[1] "b" "g" "d" "a" "e" "c" "f" "h"

答案 1 :(得分:1)

获取您的独特价值:

UniqueValues = sort(union(unique(df$V1), unique(df$V2)))

要获得两个data.frame的交集,您可以尝试:

df1 = data.frame(col1=c(1,4,6,8))
df2 = data.frame(col1=c(6,4,8,9))

similarValuesdf = merge(df1, df2)
#  col1
#1    4
#2    6
#3    8

答案 2 :(得分:1)

让我们重新创建您的数据:

DF <- read.table(text = "    V1 V2
4   b  c
14  g  h
10  d  g
6   b  f
2   a  e
5   b  e
12  e  f
1   a  b
3   a  f
9   c  h
11  d  h
7   c  d
8   c  g
13  f  g", header = TRUE, stringsAsFactors = FALSE)

将两列拆分为一个向量,并在该向量中找到唯一值:

u1 <- unique(unlist(DF[, c("V1", "V2")]))
sort(u1)
#[1] "a" "b" "c" "d" "e" "f" "g" "h"

第二个载体:

u2 <- c("d", "e", "f")

找到十字路口:

intersect(u1, u2)
#[1] "d" "e" "f"

找出设定差异:

setdiff(u1, u2)
#[1] "b" "g" "a" "c" "h"

答案 3 :(得分:0)

df_new =唯一(append(df $ V,df $ V2,after = length(df $ V1)))