【问题标题】:How to Use reference table to insert rows into a data frame in R?如何使用引用表将行插入到 R 中的数据框中?
【发布时间】:2015-05-02 05:27:12
【问题描述】:

我有一个数据框(标签),我想用作表格的参考或查找表:

V1  V2
1   1   WALKING
2   2   WALKING_UPSTAIRS
3   3   WALKING_DOWNSTAIRS
4   4   SITTING
5   5   STANDING
6   6   LAYING

要使用参考表的数据框是 (test, ncol = 564, nrow = 2947) 其中前三个 colname 是 (test_subject, test_label(num 1-6), data_set) 其中 test_label(1-6) 等于上面引用的字符串。

有人可以帮我弄清楚如何使用我的查找表插入一个名为“activity_label”的新列,并且该列的每个观察值都对应于与引用表中的引用数字等效的字符串。

例如,如果 test_label 第 1 行等于 5,那么 activity_label 第 1 行将等于“Standing”

非常感谢您的帮助!

#

使用合并方法后:

> test2[1:10, 564: 565]
   angle(Z,gravityMean) activity_label
1            0.04404283        walking
2            0.04134032        walking
3            0.04295217        walking
4            0.03611571        walking
5           -0.09080307        walking
6           -0.08602478        walking
7           -0.07997668        walking
8            0.04372663        walking
9            0.19900166        walking
10           0.20350821        walking

分析剩余dfs的结构

> str(test1)
'data.frame':   2947 obs. of  565 variables:
 $ test_labels                         : int  1 1 1 1 1 1 1 1 1 1 ...
 $ test_subject                        : int  12 12 12 12 4 4 4 12 9 9 ...
 $ observ_set                          : Factor w/ 1 level "test": 1 1 1 1 1 1 1 1 1 1 ...
 $ tBodyAcc-mean()-X                   : num  0.228 0.303 0.237 0.306 0.29 ...

> str(train1)
'data.frame':   7352 obs. of  565 variables:
 $ train_labels                        : int  1 1 1 1 1 1 1 1 1 1 ...
 $ V1                                  : int  27 7 7 26 7 26 6 6 6 7 ...
 $ observ_set                          : Factor w/ 1 level "train": 1 1 1 1 1 1 1 1 1 1 ...
 $ tBodyAcc-mean()-X                   : num  0.262 0.354 0.344 0.292 0.314 ...

【问题讨论】:

  • 您的测试表是否已经针对其中的每个测试对象包含活动编号(1、2、3、4、5 和 6),您只想创建一个附加列,其字符串等效于活动编号?
  • 嗨@vagabond,是的,这是正确的。 test-df 有一列活动编号(但没有标签),我只想插入一列“字符串”,其值与 test-df 中的“id”键相关。
  • 我复制了示例数据集、查找表和合并 - 没有收到任何错误 - 请参阅我的答案中的示例。我认为警告与您的变量的class 有关。粘贴str(test)str(lookup_table) 的输出。
  • 是的,看起来附加函数工作正常,它可能对它必须处理的所有变量感到恼火:)
  • 太好了,那么您可以通过单击复选标记接受答案并投票!

标签: r merge dataframe categorization


【解决方案1】:

一种方法是使用ifelse

如果数据框 = 测试和活动编号列 = activitynum,

test$activitylabel <- ifelse(test$activitynum == 1, "walking, ifelse(test$activitynum == 2, "walking_upstairs", ifelse(test$activitynum == 3, "walking_downstairs", ifelse(test$activitynum == 4, "sitting", ifelse(test$activitynum == 5, "standing", ifelse(test$activitynum == 6, "laying", NA))))))

另一种方法是创建一个查找表,然后按照@Jaehyeon 的建议执行merge

lookup <- data.frame(activitynum = c(1,2,3,4,5,6), activity = c("walking", "walking_upstairs", "walking_downstairs", "standing", "sitting", "laying"))

survey <- data.frame(id = c(seq(1:10)), activitynum = floor(runif(10, 1, 7)), var1 = runif(10, 1, 100))

merge(survey, lookup, by = "activitynum", all.x = TRUE)

> str(lookup)
'data.frame':   6 obs. of  2 variables:
 $ activitynum: num  1 2 3 4 5 6
 $ activity   : Factor w/ 6 levels "laying","sitting",..: 4 6 5 3 2 1
> str(survey)
'data.frame':   10 obs. of  3 variables:
 $ id         : int  1 2 3 4 5 6 7 8 9 10
 $ activitynum: num  1 2 4 1 4 6 2 4 2 2
 $ var1       : num  52.3 60.5 53.3 49.8 73.1 ...

【讨论】:

  • 嗨@vagabond 我试过你的方法,它似乎有一个警告。它抛出了一些警告(test2):cat中的错误(list(...),文件,sep,fill,labels,append):参数2(类型'list')不能由'cat'处理 - 话虽如此我的新标签列在那里。
  • 您尝试了哪种方法? merge 还是 ifelse?另外,您可以粘贴一些示例数据吗?粘贴以下输出:test[1:10, 1:5] - 我假设您的 activitynum 列和 id 在前 5 列中。
  • 我使用了合并方法,它将新列 [565] 附加到数据集的末尾。 (输出见主帖)
【解决方案2】:

我会做如下。映射由“test_label”和“id”完成,它们使用merge() 合并。如果您想保留df 中的所有值,请使用all.x = T。否则删除它。

set.seed(1237)
lookup <- data.frame(id = 1:6, activity = LETTERS[1:6])
df <- data.frame(test_label = sample(1:6, 10, replace = T))
merge(df, lookup, by.x = "test_label", by.y ="id", all.x = T)

test_label activity
1           1        A
2           1        A
3           2        B
4           2        B
5           3        C
6           5        E
7           5        E
8           6        F
9           6        F
10          6        F

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    相关资源
    最近更新 更多