【问题标题】:How to copy and move rows of data in one column into another column [closed]如何将一列中的数据行复制并移动到另一列[关闭]
【发布时间】:2018-12-28 01:10:57
【问题描述】:

R 编程语言如何将一列中的数据行复制并移动到另一列中

以上是我的 Google 搜索关键字,以下是我一直在搜索、研究和尝试执行的链接,但没有成功。我最接近的是将一行数据从一列移动到首选的“房间”列,但是,它删除了所有“房间”数据。

我还想我应该为“Unit_Code”编写一个函数来提取相应的“room_XXX”数据,但是,我不知道是否需要这样做。我只需要将“room_XXX”数据拉入 R 中为“NA”的空“房间”列单元格中。

1.) 该链接看起来像我认为我需要的,但是,尝试按照弗兰克(用户:1191259)对“如何工作”的解释,迷路了。 Filling "implied missing values" in a data frame that has varying observations per time unit

2.) 我尝试了这个链接,但是,我只尝试了一个列,并且无法将所有其他列都放入一个函数中:

ROOMS$room <- ROOMS$room[match(ROOMS$room_8_5s = 560:592, ROOMS$room_8_5s == 560:592)]

Fill in data frame with values from rows above

3.) 我无法访问此链接,以及如何编写函数: r - fill columns in data frame

期待任何帮助,因为我已经做了将近一个星期了,应该很容易,但是,我想不通。

----------
room  room_8_5s unit_code
                2
1701            1
               15
     560        8
566             8
562             8
561             8
560             8
2513           13
2512           13
2511           13

---------

期望的表格结果/结果:将“room_xxx”数据复制或移动到“房间”列。最多还有 10 个“room_xxx”列,这是一个缩写版本:

room    room_2_6ne  room_8_5s   room_13_5n  unit_code
2501                            2501        13
                                             7
                                             6
                                             4
                                             3
1601    1601                                 2
1701                                         1
                                            15
560                 560                      8
566                                          8
565                                          8
564                                          8

这是数据的处理过程:

    1. 从调查站点提取数据。
    1. 用户输入单位代码后,即1,2,3,4...
    1. 出现相应房间号的选择,即单元代码 = 2,房间_2_6ne = 1601-1632。
    1. 用户选择房间#1601。
    1. 在 R 中,我从站点中提取所有数据。
    1. 期望的结果:复制和/或移动房间号,即 room_2_6ne 到“房间”列中。
    1. 之后,在 R 中,卸载每个单元代码的 .csv 报告,只有“房间”列,没有相应的房间列,即 room_2_6ne,包括所有其他 60 个相关列(为简洁起见,此处未列出),供单位经理手动检查/验证。
    1. 在手动检查并更正错误后,我在网站上下载更正后的数据
    1. 保存数据,然后将其重新粘贴到另一个 Excel 3rd 方工作表。

致:E. Brown - 贡献者 以下是我为使其正常工作所做的工作:

48 列重新排列,然后在 col 之后添加了一个名为“rooms”的列。 #4,在“房间”列旁边,现在 = 49 列:

all <- data.frame(all[, c(1, 8:20, 2:7, 21:29, 31, 33, 35:51)])
all <- add_column(all, rooms = '', .after = 4)

然后使用新的 Col. #5 - "rooms" 运行该函数,并将所有数据指向填充 Col #6 - "room"。

for (i in 5:length(all[,5])) {
all$room[i] <- all[i,6:15][!is.na(all[i,6:15])]

(我把列标题排在下面很糟糕,你是怎么做到的?我添加了四个空格,并且数据列正确响应......)

rooms room room_1_7ne room_2_6ne room_3_5ne room_4_4n...
    2401                2401                    
    1501            1501                        
    1601        1601                            
    1701    1701                                
    567                                 
    568                                 
    569                                 

请在此处查看电子表格的图片链接: ROOM

如果我试图将数据指向第 5 列“房间”,它没有填充前 4 行数据(请参阅列 - 房间 567、568、569、571 的“房间”下)。我在顶部粘贴了“room_XXX”数据,以表明它确实属于“房间”列。我在这里错过了什么,它不会将前 4 行数据填充到“房间”列中?:

rooms   room    room_1_7ne  room_2_6ne  room_3_5ne  room_4_4n...
660 660                                 660
2501    2501                                2501    
560 560                         560     
1201    1201                        1201            
2301    2301                    2301                
2401    2401                2401                    
1501    1501            1501                        
1601    1601        1601                            
1701    1701    1701                                
    567                                 
    568                                 
    569                                 
    571                                 
572 572                                 

请在此处查看电子表格的图片链接: ROOMS

【问题讨论】:

  • 您好,您能否为您的示例数据显示您的预期结果。
  • 房间 room_2_6ne room_8_5s room_13_5n unit_code 2501 2501 13 7 6 4 3 2501 2501 2 1701 1 15 560 560 8 566 8 565 8 564 8
  • 啊,这里不知道怎么正确回答……
  • 嗨,我刚刚使用期望的结果/结果表编辑和更新了我的原始帖子。
  • 我无法理解您如何生成所需输出的逻辑。请逐步清楚地解释您如何达到所需的输出。另外,请使用dput 添加一些示例数据

标签: r rows


【解决方案1】:

如果我理解正确,这个简单的循环会做你想做的事,我认为这是从多个列中找到单个非 NA 值,并创建一个包含所有非 NA 值的新列。

样本数据:

col1 <- c(1, NA, NA, NA)
col2 <- c(NA, 2, NA, NA)
col3 <- c(NA, NA, 3, NA)
col4 <- c(NA, NA, NA, 4)
merged <- c(NA,NA,NA,NA)
all <- data.frame(merged, col1, col2, col3, col4)

示例解决方案:

for (i in 1:length(all[,1])) {
    all$merged[i] <- all[i,2:5][!is.na(all[i,2:5])]
}

【讨论】:

  • 您好 E. Brown,我尝试了该功能,并将列更改为 1:51,因为我有 51 列并收到此错误:for (i in 1:length(all[,1] )) { + all$room[i]
  • 看起来您粘贴的代码行不是错误,所以我看不出出了什么问题。确保您要存储信息的列不在 1:51 中。我把存储列设置为 1,这就是示例中的范围为 2:5 的原因。我可以预见的另一个问题是,如果您的数据存在多列具有非 NA 值的情况,例如,您必须调整代码以采用第一个。
  • 这行得通!!!查看我在上面编辑的内容 - 起初,我尝试 6:51,但是,我知道我删除了三列,在我之前的列重新排列中,现在 = 48 列,现在看到它。结果贴出来了,不好意思,不知道怎么让列标题和数据列对齐……
  • 嗨,试图编辑编辑的帖子,不能,函数中的列应该阅读 6:14,而不是 6:48,我只需要那九 (9) 个“room_XXX”列填写“房间”一栏。
  • 尝试重新运行函数:for (i in 5:length(all[,5])) { all$room[i]
【解决方案2】:

library(tidyverse)

如果您的数据框是:

> df
# A tibble: 12 x 5
    room room_2_6ne room_8_5s room_13_5n unit_code
   <int>      <int>     <int>      <int>     <int>
 1    NA         NA        NA       2501        13
 2    NA         NA        NA         NA         7
 3    NA         NA        NA         NA         6
 4    NA         NA        NA         NA         4
 5    NA         NA        NA         NA         3
 6    NA       1601        NA         NA         2
 7  1701         NA        NA         NA         1
 8    NA         NA        NA         NA        15
 9    NA         NA       560         NA         8
10   566         NA        NA         NA         8
11   565         NA        NA         NA         8
12   564         NA        NA         NA         8

...我们可以使用tidyverse 中的tidyr 来收集、变异和传播:

df %>%
  gather(value_name, value, -room, -unit_code) %>%
  mutate(room = ifelse(is.na(room), value, room)) %>%
  spread(value_name, value)

...导致:

# A tibble: 15 x 5
    room unit_code room_13_5n room_2_6ne room_8_5s
   <int>     <int>      <int>      <int>     <int>
 1   560         8         NA         NA       560
 2   564         8         NA         NA        NA
 3   565         8         NA         NA        NA
 4   566         8         NA         NA        NA
 5  1601         2         NA       1601        NA
 6  1701         1         NA         NA        NA
 7  2501        13       2501         NA        NA
 8    NA         2         NA         NA        NA
 9    NA         3         NA         NA        NA
10    NA         4         NA         NA        NA
11    NA         6         NA         NA        NA
12    NA         7         NA         NA        NA
13    NA         8         NA         NA        NA
14    NA        13         NA         NA        NA
15    NA        15         NA         NA        NA

试试:

df %>%
      gather(value_name, value, -room, -unit_code)

然后:

df %>%
      gather(value_name, value, -room, -unit_code) %>%
      mutate(room = ifelse(is.na(room), value, room))

...了解这些函数的作用。

【讨论】:

  • 您好玛丽安,我尝试了您的函数并收到以下错误:-> 错误:行 (1144、1284)、(3072、3096)、(3118、3347) 的标识符重复,( 1371, 1543), (1598, 1802), (2009, 2061), (2236, 2320), (2364, 2579), (2823, 2830) -> 调用 rlang::last_error() 查看回溯 * 我试图调查tidyverse.org 还在这里找到了一张备忘单:github.com/rstudio/cheatsheets/blob/master/data-import.pdf * 我试图理解“value_name”、“value”部分 - 我是否要将“value_name”替换为:room_2_6ne、room_8_5s、room_XXX...?
  • 嗨@TV,您能在帖子底部dput()您的数据(或至少您发布的部分)吗?
  • 嗨,玛丽安,我刚刚编辑了上面的窗口,并发布了我的结果。对 dput 的大输出感到抱歉 - 我想在你看到它包含的内容后我应该删除它......我错过了什么?
猜你喜欢
  • 2021-11-27
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 2020-11-05
  • 2021-10-16
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
相关资源
最近更新 更多