2017-10-10 61 views
-1

是否可以将一列中的一个单元格的数据从时间戳记中的一个时间戳记移动到另一个时间戳记而不丢失任何其他数据?我尝试过移位和滑动功能,但它用NA值替换数据。 我尝试过使用mutate函数,但它改变了完整的列。是否有任何函数或方法来执行操作?将单元格值从一个时间戳移到另一个R中

E.g,转换:

Date_Time | x | y  
01-01-2016 | 1 | 2  
02-01-2016 | 3 | 4 
03-01-2016 | 5 | 6 
04-01-2016 | 2 | 5 

到:

Date_Time | x | y 
01-01-2016 | 5 | 2 
02-01-2016 | 3 | 4 
03-01-2016 | 1 | 6 
04-01-2016 | 2 | 5 

或滑动数据垂直

Date_Time | x | y 
01-01-2016 | 2 | 2 
02-01-2016 | 1 | 4 
03-01-2016 | 3 | 6 
04-01-2016 | 5 | 5 
+0

我不明白你要强加的规则。你如何决定你正在移动哪些价值观,以及他们要去哪里?此外,它会帮助看到没有工作的代码。 –

+0

我正在尝试使用具有最小值的时间戳与最大值交换时间戳的单元格。 –

回答

0

两个交换你需要持有一个在临时变量两个值。我们可以写一个简单的函数:

swap = function(x, i, j) { 
    stopifnot(length(i) == length(j)) 
    temp = x[i] 
    x[i] = x[j] 
    x[j] = temp 
    return(x) 
} 

上的数据,就应该像这样工作,得到期望的结果:与dplyr

your_data$x = swap(your_data$x, which.min(your_data$x), which.max(your_data$x)) 
+0

在循环中实现交换功能时出现以下错误。 其中.min(allData [i]): (list)对象无法被强制键入'double'的错误 调用自:swap(allData [i],which.min(alldata [i]),which。 max(allData [i])) –

+0

如果没有看到您的循环代码,不知道发生了什么。你是循环行还是列?交换是在交换中矢量化的,因此循环行不应该是必需的。如果循环遍历列,请使用allData [[i]]或allData [,i]来使用向量,allData [i]'仍然是列表/数据框,只有一列。 – Gregor

0

其他两个选项:

library(dplyr) 

df %>% 
    mutate(x = case_when(
    x == max(x) ~ min(x), 
    x == min(x) ~ max(x), 
    TRUE ~ x 
)) 

df %>% 
    mutate(x = replace(x, c(which.max(x), which.min(x)), c(min(x), max(x)))) 

结果:

Date_Time x y 
1 01-01-2016 5 2 
2 02-01-2016 3 4 
3 03-01-2016 1 6 
4 04-01-2016 2 5 

要移动x垂直:

df %>% 
    mutate(x = c(x[-1], x[1])) 

df %>% 
    mutate(x = c(x[length(x)], x[-length(x)])) 

结果:

> df %>% 
+ mutate(x = c(x[-1], x[1])) 
    Date_Time x y 
1 01-01-2016 3 2 
2 02-01-2016 5 4 
3 03-01-2016 2 6 
4 04-01-2016 1 5 

> df %>% 
+ mutate(x = c(x[length(x)], x[-length(x)])) 
    Date_Time x y 
1 01-01-2016 2 2 
2 02-01-2016 1 4 
3 03-01-2016 3 6 
4 04-01-2016 5 5 

数据:

df = read.table(text = "Date_Time | x | y  
01-01-2016 | 1 | 2  
02-01-2016 | 3 | 4 
03-01-2016 | 5 | 6 
04-01-2016 | 2 | 5", header = TRUE, sep = "|") 
+0

我想申请'for'循环来执行mutate函数的情况。 但我没有得到预期的结果,实际上没有改变。我必须为环路工作做些不同的事情吗? –

+0

@neekitanarayan你的问题并不清楚,你将for循环应用于什么?你期望的结果是什么?我的解决方案匹配您所需的输出,因此如果您有任何其他规格,请编辑您的问题主体以纳入新信息。 – useR

相关问题